二维数组的定义和初始化
//规则数组
int[][] a = new int[2][3];
int[][] a2 = {{1,2,3},{4,5,6}};
int[][] a3 = new int[][]{{1,2,3},{4,5,6}};
//不规则数组
int[][] a4 = new int[2][];
a4[0] = new int[3];
a4[1] = new int[2];
3种初始化方式其中a2和a3都已初始化,a和a4需要一个元素一个元素赋值。
a[i][j] = k;
数组的遍历
1.for
public static void show1(int[][] array){
for(int i = 0;i < array.length;i++){
for(int j = 0;j < array[i].length;j++){
System.out.print(array[i][j]+" ");
}
System.out.println();
}
}
2.foreach
public static void show2(int[][] array){
for( int[] brr: array ){
for(int i:brr){
System.out.print(i+" ");
}
System.out.println();
}
}
第一种为for循环的方式,for循环的好处是每次通过下标访问,所以可以通过改变下标来访问不同的元素。
第二种方式为增强for循环,foreach循环方便了开发,可是foreach并不能控制数组的下标,只会按顺序获取每个元素,然后进行处理。
总体而言每个都有其好处,也有其坏处,所以应该根据情况进行使用。
二维数组的拷贝
1.直接copy地址
int[][] array = {{1,2,3},{4,5,6}};
int[][] array2 = new int[2][3];
array2 = array;
array2改变,array也会改变因为他们指向同一块内存空间。
如图
2.直接copy
对于基本类型
int[][] array = {{1,2,3},{4,5,6}};
int[][] array2 = new int[2][3];
for(int i = 0;i < array.length;i++){
for(int j = 0;j < array[i].length;j++){
array2[i][j] = array[i][j];
}
}
这种方式是深拷贝,因为是把每一个基本元素的值赋给了array2数组
3.clone拷贝
此处有坑,从7-咸鱼学Java-Java中的数组中可以看出,clone方法可以直接clone数组
此处进行实验
int[][] a = {{1,2,3},{4,5,6}};
int[][] b = new int[2][3];
b = a.clone();
show1(a);//可以打印数组的函数
show1(b);
System.out.println("改");
a[0][0] = 10086;
show1(a);
show1(b);
结果
1 2 3
4 5 6
++++++++++++++++++++++++
1 2 3
4 5 6
++++++++++++++++++++++++
改
10086 2 3
4 5 6
++++++++++++++++++++++++
10086 2 3
4 5 6
++++++++++++++++++++++++
在一维数组中改变并不会使原数组发生变化,原因是什么呢?
因为你clone的是二维数组中存储地址的哪一个维度,所以其实他们指向的数据域是一块区域,所以当你改变a的时候,b会跟着改变
正确的clone为
int[][] a = {{1,2,3},{4,5,6}};
int[][] b = new int[2][3];
for (int i = 0; i < a.length; i++) {
b[i] = a[i].clone();
}
show1(a);
show1(b);
System.out.println("改");
a[0][0] = 10086;
show1(a);
show1(b);
结果
1 2 3
4 5 6
++++++++++++++++++++++++
1 2 3
4 5 6
++++++++++++++++++++++++
改
10086 2 3
4 5 6
++++++++++++++++++++++++
1 2 3
4 5 6
++++++++++++++++++++++++
4.System.arraycopy
详情见7-咸鱼学Java-Java中的数组-3.4
其copy的时候也不能直接copy也需要通过for循环循环copy,要不然就像上面一样,只拷贝了地址维度,并没有copy到值。
5.Arrays.copyOf
详情见7-咸鱼学Java-Java中的数组-3.5
其余特性同上。
二维数组的copy和一位数组相同,对于引用类型来说,copy的都为地址,所以都是浅拷贝,对于基本类型来说都是深拷贝