数组基本概念
当有多个同类型的数据需要处理的时候,我们可以把它们放入一个数组中,利用数组的特性进行储存、展示、运算等。和生活中的水杯、盒子一样,数组也是一种容器,它有固定的长度,固定的类型。
数组中的元素有各自的索引,也就是下标,下标是从0开始的,即数组的第一个元素下标为0,第二个元素下标为1...以此类推,数组的最后一个元素下标为数组长度减1,即arr.length - 1。
数组的创建
知道了数组的基本概念,我们需要创建数组来使用。数组的创建分为静态初始化和动态初始化。
静态初始化顾名思义,在创建的时候已经给定好了数组中的元素个数以及内容。
int[] arr = {1,2,3,4,5};//int[]代表这是整型的数组类型 arr变量名 {}内定义数组元素:
int[] arr = new int[]{1,2,3,4,5};//这两种静态初始化是一样的,上面是简化版。因为数组本质上也是一个对象
//还可以拆开来写 (简化版不能拆开)
int[] arr;
arr = new int[]{1,2,3,4,5};
数组的动态初始化
动态初始化数组即不知道开始先创建一个数组,定义好数组的长度,但是没有具体的定义具体的内容。
int[] arr = new int[5]; //表示创建一个长度为5的数组
int[] arr;//也可以拆开来这么写
arr = new int[5];
需要注意的是,动态创建数组后如果没有对数组内容进行初始化赋值,那么数组内元素是有默认值的。
如:int默认值为0,double默认值为0.0,引用类型如对象默认为null,布尔默认类型为false。
数组的赋值
int[] arr = new int[5];//动态创建数组,长度为5
//可以依次进行赋值
arr[0] = 1;
arr[1] = 1;
arr[2] = 1;
arr[3] = 1;
arr[4] = 1;
//可以用循环遍历数组来赋值
for(int i = 0; i < arr.length; i++) {
arr[i] = 1;
}
//数组快速初始化
int[] arr = new int[5];
Arrays.fill(arr, 1); //逗号前为数组变量名,逗号后为初始化的值,将所有元素都赋值为1。
数组的遍历
数组的遍历除了手动一个个将数组元素取出外,还有三个快速遍历的方法。其中for循环遍历还可以对数组进行赋值和修改运算等,foreach和Arrays.toString只能展示打印数组中的元素,用于查看数组内容比较方便。
int[] arr = {1,2,3,4,5};//初始化一个数组
//1.for循环遍历打印
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
//2.foreach遍历
for(int i : arr) { //int为数据类型 i为变量名 arr为数组变量名
System.out.println(i);
}
//3.Arrays.toString()
System.out.println(Arrays.toString(arr));//这个方法可以打印出数组元素内容
数组的内存分析
数组本质上是一种对象,当我们new一个数组的时候,会在堆中开辟一个相应的空间,然后将此空间的地址赋给栈中的arr这个变量,arr这个变量就是这个数组的引用。
当我们创建一个另一个数组,然后将上一个数组的变量名赋给这个新数组的时候,实际上这个新数组就同样指向了旧数组的内存地址,也就是说现在新数组和旧数组访问的是同一个数组,任一方都能对该数组的元素进行修改。说白了就是数组还是这一个数组,只不过它拥有了两个不一样的名字,用任意一个名字都可以对其进行操作。
同理,当有两个不同数组的时候,它们的变量名指向的是各自的数组空间地址:
如果写上这句代码:arr = arr1; 那么arr这个变量就会指向arr1所指向的数组地址,而arr原先指向的数组空间将会被系统回收,这样就完成了数组地址的赋值。