前言
在 Java 编程中,我们经常要处理一系列数据,数组作为最基础、常用的数据结构,就像有序容器,能有效存储和管理数据。接下来,让我们深入探索 Java 数组,从基础到高级,掌握这一关键知识,助力 Java 编程。
一、数组的概述1.1什么是数组?数组指的是一种容器,可以用来存储同种数据类型的多个值。
1.2注意:这里在存储数据的时候要注意隐式转换。
代码语言:javascript复制int 类型的容器可存储(byte,short,int)
double 类型的数组容器可储存(byte,short,int,long,float,double)
(大)double>float>long>int>short>byte(小)
大可以储存小(隐式转换),小不可以储存大!(强制转换)1.3建议:容器的类型和存储的数据类型保持一致~!
二、数组的定义1.格式:代码语言:javascript复制格式:
数据类型 [] 数组名 或 数据类型 数组名 []
int [] arry 或 int arry [][]此符号代表定义的是一个数组,不写代表定义的是一个变量
三、数组的静态初始化1.数组的初始化:初始化:就是在内存中,为数组容器开辟空间,并将数组存入容器中的过程。
包括:静态初始化和动态初始化
2.静态初始化:数组的内容是固定的已知的。
格式:代码语言:javascript复制完整格式:
数据类型 [] 数组名 = new 数据类型[]{元素1,元素2,元素3......};
int [] nums = new int [] {1,2,3,4,5};
简化格式:
数据类型[] 数组名={元素1,元素2};
int arry []={1,2,3};数组的长度:arry : 长度为3
11
22
33
四、数组的地址值当我们定义一个数组,其中含有三个元素(1,2,3),打印出这个数组arry.
代码语言:javascript复制eg:
int arry []={1,2,3};
System.out.println(arry);运行展示:
代码语言:javascript复制[I@10f87f48运行出来会出现一段乱码,当然乱码并不是真的乱码,而是数组的地址值
1.1地址值:就是表示数组在内存中的位置。
1.2拓展:解释一下地址值的格式含义:
[:表示当前是一个数组
I:表示当前数组里面的元素是int类型的
@:表示一个间隔符号(固定格式)
10f87f48:这才是数组真正的地址值(十六进制)
平时我们习惯性的会把这个整体叫做数组的地址值
五、数组的元素访问1.格式:代码语言:javascript复制数组名[索引];
eg:
nums[0];2.索引:数值
1
2
3
4
索引(下标)
0
1
2
3
特点:从0开始,逐个+1增长,连续不断
3.获取数组中的元素代码语言:javascript复制int [] arr={11,12,13};
int num=arr[0];
System.out.println(num);
简单写法:
int [] arr={11,12,13};
System.out.println(arr[0]);代码语言:javascript复制run:
114.把数据存入到数组中代码语言:javascript复制格式:
数组名[索引]=具体数据/变量
arr[0]=100代码语言:javascript复制public class boke {
public static void main(String[] args) {
int [] arr={11,12,13};
arr[0]=100;
System.out.println(arr[0]);
}
}代码语言:javascript复制run:
100细节:一旦覆盖之后,原来的数据就不存在了
六、数组的遍历1.数组的遍历:将数组中所有的内容取出来,取出来之后(打印,求和,判断)
注:遍历指的是取出数据的过程不要局限的理解为遍历就是打印
根据我们上文的学习,大家可能会想,我一个个使用arr[i]打印出来不行吗?
代码语言:javascript复制public class boke{
public static void main(String[]args){
int [] arr={1,2,3,4,5};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);
}
}代码语言:javascript复制run:
1
2
3
4
5虽然这样一个一个println也可以遍历出数组的数据,可是当数组的数据个数足够庞大时我们应该怎么办呢?
我们想到了循环:将索引换成变量i,然后再循环打印arr[i]
我们来做一下代码实现:
代码语言:javascript复制int [] arr={11,12,13};
for (i=0;i<=4;i++){
System.out.println(arr[i]);
}我们在写循环时可能会遇到数组长度的问题,我们有一个官方写法:
代码语言:javascript复制调用方式:
数组名.length
System.out.println(arr.length);
//打印数组的长度2.拓展:自动的快速生成数组的遍历方式
由IDEA提供的,数组名.fori回车,就会出现以下代码。
代码语言:javascript复制for (int i=0;i System.out.println(arr[i]); }3.练习:3.1遍历数组求和代码语言:javascript复制//将数组中的11,22,33,44,55,66,77,88,99求和 public class bianli{ public static void main (String[]args){ int [] num ={11,22,33,44,55,66,77,88,99}; int sum = 0; for (int i=0 ; i sum+=num[i]; } System.out.println(sum); } }3.2条件变化代码语言:javascript复制//如果是奇数,将当前数字扩大两倍,偶数将当前数字变成1/2 int [] num={1,2,3,4,5,6,7,8,9,10}; for (i=0 ; i if (num[i]%2==0){ num[i]/=2; }else{ num[i]*=2; } System.out.println(num[i]); }一般情况下,一个循环只做一件事,于是我们可以优化一下 代码语言:javascript复制int [] num={1,2,3,4,5,6,7,8,9,10}; for (i=0 ; i if (num[i]%2==0){ num[i]/=2; }else{ num[i]*=2; } } for (i=0 ; i System.out.println(num[i]); }//重新遍历一下七、数组的动态初始化1.动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。 代码语言:javascript复制格式: 数据类型[]数组名=new 数组类型[数组长度]; int [] arr = new int [3]; //先建立一个空壳,[3]说明只能存3个int类型的整数在创建的时候,有我们自己指定数组的长度,由虚拟机给出默认的初始值。 1.1信息存入:1.1.1添加:代码语言:javascript复制arr[0]=3;1.1.2获取:代码语言:javascript复制System.out.println(arr[1]); run:0(默认初始化值)1.2数组默认初始化值的规律代码语言:javascript复制整数类型:默认初始化值0 小数类型:默认初始化值0.0 字符类型:默认初始化值‘/u0000’空格 布尔类型:默认初始化值false 引用数据类型:默认初始化值null2.动态初始化与静态初始化的区别动态: 含义:手动指定数组的长度,由系统给出默认初始化值 只明确元素的个数,不明确具体数值,推荐使用动态初始化 eg: 使用数组容器来存储键盘录入的5个整数 代码语言:javascript复制int [] arr = {????}; int [] arr = new int[5]静态: 含义:手动指定数组元素,系统会根据元素个数,计算出数组的长度。 需求中已经明确了要操作的具体数据,直接静态初始化即可。 eg: 将全班 的学生成绩存入数组中11,22,33 代码语言:javascript复制int [] nums= {11,22,33};八、数组的常见问题索引越界异常:访问了不存在的索引 索引的范围:0~数组的长度-1 九、数组的常用操作1.求最值代码语言:javascript复制//已知数组元素为{33,5,22,44,55},请找出数组中最大的值并打印在控制台。 public class wenti { public static void main(String[] args) { int [] best ={33,5,22,44,55}; int max = best[0];//记录数值的变化 for (int i = 0; i < best.length; i++) { //遍历数组中的每一个元素,让他和max比较,如果找到更大的就记录 if (best[i]>max) { max = best[i]; } } System.out.println(max); } }2.遍历求和代码语言:javascript复制//生成10个1-100之间的随机数存入数组 //求出所有数据的和 //求出所有数据的平均数 //统计有多少个数据比平均数小 import java.util.Random; public class suym { public static void main(String[] args) { Random rand = new Random(); int [] num = new int[10]; int sum = 0; int count = 0; for (int i = 0; i < 10; i++) { int x = rand.nextInt(100)+1; num[i] = x; sum += x; System.out.println(x); if (num[i] < sum/10){ count++; } } System.out.println("生成随机数的和为:"+sum); System.out.println("生成随机数的平均数为:"+sum/10); System.out.println("小于平均数的个数为:"+count); } }3.交换数据代码语言:javascript复制//将数组{1,2,3,4,5}顺序交换 public class jiaoone { public static void main(String[] args) { int [] arr={1,2,3,4,5}; //从两头开始遍历,然后交换 for(int i=0 , j=arr.length-1 ; i //找一个工具人,方便交换 int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } for (int i = 0; i < arr.length; i++) { //print同行打印 System.out.print(arr[i]+" "); } } }4.打乱数据代码语言:javascript复制//需求:将数组打乱 import java.util.Random; public class da { public static void main(String[] args) { //导入随机数 Random ran=new Random(); int random=ran.nextInt(nums.length); int [] nums={1,2,3,4,5}; for (int i = 0; i < nums.length; i++) { //遍历数组拿着它和随机索引交换 int temp=nums[i]; nums[i]=nums[random]; nums[random]=temp; } for (int i = 0; i < nums.length; i++) { System.out.print(nums[i]+" "); } } }十、数组的内存图1.java的内存分配注:从JDK8开始,取消方法区,新增原空间,把原来方法区的多种功能拆分,有的功能放到了推中,有的功能放到了元空间中。 栈:方法运行时使用的内存,比如main方法运行进入方法栈中执行。 堆:存储对象或者数组,new来创建的,都存在堆内存 方法区:存储可以运行的class文件 本地方法栈:JVM在使用操作系统功能的时候,和我们开发无关。 寄存器:给CPU使用,和我们开发无关 2.数据的内存图通过arr找到地址值,再通过索引找到数组内容。 注: 1.只要是new出来的一定是在推里面开辟了一个小空间 2.如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据。 两个数组指向同一个空间的内存图: 注:当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了。