一、二维数组定义方式
//规则数组
int[][]array=new int [2][3];//二维数组定义
int[][]array1={{1,2,3},{4,5,6}};
int[][]array3=new int[][]{{1,2,3},{4,5,6}};
//不规则数组
int[][] array4 = new int[2][];
array4[0] = new int[3];
array4[1] = new int[2];
二、二维数组的遍历方式
//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();
}
}
//foreach
public static void show2(int[][] array){
for( int[] brr: array ){
for(int i:brr){
System.out.print(i+" ");
}
System.out.println();
}
}
三、二维数组的拷贝
3.1.直接拷贝数组的地址
int[][] array = {{1,2,3},{4,5,6}};
int[][] array2 = new int[2][3];
array2 = array;
此时是把array的地址给了array2,俩者指向同一块内存,所以,当其中一个数组的某个元素改变时,另一个数组的相对应元素也会发生改变。
3.2 、for循环遍历拷贝
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];
}
}
3.3、 clone拷贝
int[][] array = {{1,2,3},{4,5,6}};
int[][] array2 = new int[2][3];
array2 = array.clone();
show1(array);
System.out.println("======");
show1(array2);
array2[0][0] = 1000;
System.out.println("====改变==");
show1(array);
System.out.println("======");
show1(array2);
结果为 :
由上图可以看出,当一个数组发生变化的时候,另一个数组也随之改变,但是在一维数组中并没有出现这种情况。
原因:二维数组clone原理是将每一个一维数组array[x](地址或对象引用)赋值给目标,如下图所示:
正确的拷贝方式:
int[][] array = {{1,2,3},{4,5,6},{4,5}};
int[][] array2 = new int[array.length][];
for(int i = 0;i < array.length;i++){
array2[i] = array[i].clone();
}
这种拷贝方式是一种深拷贝。
3.4、Arrays.copyOf与 Arrays.arraycopy
Arrays.arraycopy
int[][] array = {{1,2,3},{4,5,6}};
int[][] array2 = new int[2][3];
for(int i = 0;i < array.length;i++){
System.arraycopy(array[i], 0, array2[i],
0, array[i].length);
Arrays.copyOf
int[][] array = {{1,2,3},{4,5,6}};
int[][] array2 = new int[2][3];
for(int i = 0;i < array.length;i++){
array2[i] = Arrays.copyOf(array[i],array[i].length);
对于基本类型的数组,Arrays.copyOf与 Arrays.arraycopy俩种拷贝方式,他们与clone拷贝方式一样,必须使用for循环进行拷贝,不然拷贝的只是地址,并没有拷贝到值。
与一维数组相同clone,Arrays.copyOf与 Arrays.arraycopy三种拷贝方式,对于基本类型的数组都是深拷贝,而对于引用类型的数组,他们都是浅拷贝。
四、拷贝结论
二维数组中浅拷贝特点:一位数组元素相同
int[][] array = {{1,2,3},{4,5,6},{4,5}};
int[][] array2 = array.clone();
System.out.println(array);
System.out.println(array2);
System.out.println(Arrays.toString(array));//一维数组元素
System.out.println(Arrays.toString(array2));
运行结果:
[[I@15db9742
[[I@6d06d69c
[[I@7852e922, [I@4e25154f, [I@70dea4e]
[[I@7852e922, [I@4e25154f, [I@70dea4e]
二维数组中深拷贝特点:一位数组元素不同
int[][] array = {{1,2,3},{4,5,6},{4,5}};
int[][] array2 = new int[array.length][];
for(int i = 0;i < array.length;i++){
array2[i] = array[i].clone();
}
System.out.println(array);
System.out.println(array2);
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array2));
运行结果:
[[I@15db9742
[[I@6d06d69c
[[I@7852e922, [I@4e25154f, [I@70dea4e]
[[I@5c647e05, [I@33909752, [I@55f96302]