概念
什么是
是一组具有相同名称,相同类型,不同索引号的变量的集合。
例如: a[0] a[1] a[2] a[3] .... 规定:它们均用来存放int型整数。
则,它们就可以统称为 一个int型数组a。
分类
1) 一维数组: 数组的元素拥有一个索引号。例如: a[1] 表示数组a的第1个位置上的元素。
2) 多维数组: 数组的元素拥有多个索引号。例如: a[1][2] 表示数组a的第1行的第2个位置上的元素。
特性
1) 它的元素具有相同的名称,相同类型,不同索引号;
2) 它以队列的原理来管理所有元素。即: 逻辑上相邻,物理上也相邻。
3) 它有一个 length属性,表示元素个数或数组长度。
4) 它的元素的索引号从 0 至 length-1 。
5) 它的数组名称是一个变量,用来存放数组的地址(引用)。
6) 数组必须先声明,再创建,最后使用(访问)。
7) 数组一旦创建,其元素个数就确定,不可变。
8) 数组是属于引用类型。即: 一个数组就是一个对象。
一维
一维数组的声明、创建、访问
例如:
声明: int[] a; 或 int[] a = null;
创建: a = new int[10];
访问: int x = a[i]; 将数组a的第i个位置上的元素值赋给x
注:访问数组的所有元素,往往与 for循环关联;
数组的初始化,即: 让数组的元素第一次得到值,它也往往与for循环关联;
通过赋值方式直接创建数组
例如: int[] a = { 1, 9, 99, 221, 31 };
Person[] ss = { new Person(), newPerson("张三", true, 18) };
注意: 会画一维数组的内存图。
Demo
注意: 在声明数组时,不可指定其元素个数。
例如: int[10] a; //error
多维
其元素拥有一个以上的索引号。
以二维数组为例来理解并掌握多维数组。
Demo
二维数组的声明、创建、访问
声明: int[][] a; 或 int[][] a= null;
创建: a = new int[3][5]; 表示创建了一个三行五列的二维数组a
或
a =new int[3][]; 表示创建了一个三行,而每行的元素个数待定的二维数组a
for(int i = 0; i < a.length; i++ ){
a[i] = new int[5]; //为第i行创建了一个具有5个元素的一维数组。
}
注意: 在Java中,实质没有多维数组。即: 多维数组实质上是由多个一维数组组成的。
访问: int x = a[i][j] ; 访问了数组a的第i行的第j列的元素。
在Java中,多维数组有两种
1) 规则的;
2) 不规则的;
以二维数组为例发现:
1) 二维数组的每一行的元素个数相同。则表明此二维数组是规则的。
2) 二维数组的每一行的元素个数可以不同。则表明此二维数组是不规则的。
注:二(多)维数组的访问,往往与嵌套的for循环关联。
二维数组内存分配图
深浅复制
定义一个数组int[] a={3,1,4,2,5}; int[] b=a; 数组b只是对数组a的又一个引用,即浅拷贝。如果改变数组b中元素的值,其实是改变了数组a的元素的值,要实现深度复制,可以用clone或者System.arrayCopy。
如下面的代码:
int[] a={3,1,4,2,5};
int[] b=a.clone();
b[0]=10;
System.out.println(b[0]+" "+a[0]);
输出为10 3
可见改变了b的值,但是没有改变a的元素的值。
但是clone和System.arrayCopy都是对一维数组的深度复制。对于二维数组
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+" "+a[0][0]);
输出为10 10
所以clone并不能直接作用于二维数组
因为java中没有二维数组的概念,只有数组的数组。所以二维数组a中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。
要证明,只需看下面的输出
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+" "+a[0][0]);
System.out.println(a[0]==b[0]);
第5句输出为true。
用clone对二维数组进行复制,要在每一维上调用clone函数
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=new int[a.length][];
for(int i=0;i<a.length;i++){
b[i]=a[i].clone();
}
b[0][0]=10;
System.out.println(b[0][0]+" "+a[0][0]);
System.out.println(b[0]==a[0]);
输出为
10 3
false
业务思想
java中使用数组来保存一组相同数据类型的数据。当你需要保存一组数据类型相同的变量或者对象时,我们不可能给每一个变量都定义一个变量名,这样的操作代码臃肿、工作量大且无意义,这时候我们就使用数据来保存这些数据,数组会根据角标来为每个数据分配地址。在java中如果想要保存一组基本类型的数据,使用数组;如果想保存一组对象或者其他类型的复杂数据可以使用集合。