Java二维数组及其拷贝方式

二维数组定义方式:

//规则数组 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(); } }

forreach
public static void show2(int[][] array){ for( int[] brr: array ){ for(int i:brr){ System.out.print(i+" "); } System.out.println(); } }

使用for循环可以通过改变下标来访问不同的数组元素
forreach只能按顺序来访问数组中的每一个元素。
二维数组的拷贝:
1.直接拷贝数组的地址
int[][] array = {{1,2,3},{4,5,6}}; int[][] array2 = new int[2][3];

此时是把array的地址给了array2,俩者指向同一块内存,所以,当其中一个数组的某个元素改变时,另一个数组的相对应元素也会发生改变。
Java二维数组及其拷贝方式
文章图片

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]; } }

这种拷贝是深拷贝,即把array数组的每一个元素都赋值给了array2数组,其中一个数组改变,另一个数组并不会改变。
对于引用类型
TestArray[][] t1 = new TestArray[2][3]; for(int i = 0; i < t1.length; i++){ for(int j = 0; j < t1[i].length; j++){ t1[i][j] = new TestArray(); } }TestArray[][] t2 = new TestArray[2][3]; for(int i = 0; i < t1.length; i++){ for(int j = 0; j < t1[i].length; j++){ t2[i][j] = t1[i][j]; } }

这种拷贝是浅拷贝,即他只是把array数组内的地址赋给了array2数组,俩个数组的地址相同,即俩个数组都指向同一块内存,一个数组改变,另一个自然也会改变。
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);

结果为
Java二维数组及其拷贝方式
文章图片

由上图可以看出,当一个数组发生变化的时候,另一个数组也随之改变,但是在一维数组中并没有出现这种情况。原因如下图
Java二维数组及其拷贝方式
文章图片

正确的拷贝方式:
int[][] array = {{1,2,3},{4,5,6}}; int[][] array2 = new int[2][3]; for(int i = 0; i < array.length; i++){ array2[i] = array[i].clone(); }

这种拷贝方式是一种深拷贝。
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循环进行拷贝,不然拷贝的只是地址,并没有拷贝到值。
【Java二维数组及其拷贝方式】与一维数组相同clone,Arrays.copyOf与 Arrays.arraycopy三种拷贝方式,对于基本类型的数组都是深拷贝,而对于引用类型的数组,他们都是浅拷贝。
对于深拷贝
Java二维数组及其拷贝方式
文章图片

对于浅拷贝
Java二维数组及其拷贝方式
文章图片

    推荐阅读