浅拷贝:
数组如果存放引用类型地址,进行拷贝后,原数组中存放的地址拷贝到新数组中,此时是两个相同的引用指向一个对象。如果原数组把内容更改,拷贝的数组内容对应也做更改。
深拷贝:
新数组的地址与原数组的地址不同,不是简单的引用拷贝。原数组内容改变时,新数组的内容不会改变。
数组内容是简单类型的,如int、float甚至String类型,使用clone()、copyOf()、arraycopy()方法拷贝,实现的都是深拷贝。新的数组放在一个新的地址中。
int arr1[] = {1,2,3};
int arr2[] = arr1.clone();
int arr3[] = Arrays.copyOf(arr1, arr1.length);
int arr4[] = new int[3];
System.arraycopy(arr1, 0, arr4, 0, arr1.length);
arr1[2] = 9; //改变arr1 看看复制的数组有无改变
System.out.println("clone方法克隆:");
System.out.println(Arrays.toString(arr2)); //[1, 2, 3]
System.out.println("copyOf方法克隆:");
System.out.println(Arrays.toString(arr3)); //[1, 2, 3]
System.out.println("arraycopy方法克隆:");
System.out.println(Arrays.toString(arr4)); //[1, 2, 3]
但一个多维数组的拷贝,不能直接用以上三个方法直接拷贝。而应该用for循环,把多维数组分成一维的数组来拷贝,这样每个一维数组都是一个新的地址,组合成的多维数组也是新的地址。
int arr1[][] = {{1,1,1},{2,2,2},{3,3,3}};
int arr2[][] = new int[3][3];
for(int i = 0;i < 3;i++) {
arr2[i] = arr1[i].clone();
}
int arr3[][] = new int[3][3];
for(int i = 0;i < 3;i++) {
arr3[i] = Arrays.copyOf(arr1[i], arr1[i].length);
}
int arr4[][] = new int[3][3];
for(int i = 0;i < 3;i++) {
System.arraycopy(arr1[i], 0, arr4[i], 0, arr1[i].length);
}
arr1[2][2] = 9; //改变arr1 看看复制的数组有无改变
System.out.println("clone方法克隆:");
for(int i = 0;i < 3;i++) {
System.out.println(arr2[i]); //[I@15db9742 [I@6d06d69c [I@7852e922
}
System.out.println("copyOf方法克隆:");
for(int i = 0;i < 3;i++) {
System.out.println(arr3[i]); //[I@4e25154f [I@70dea4e [I@5c647e05
}
System.out.println("arraycopy方法克隆:");
for(int i = 0;i < 3;i++) {
System.out.println(arr4[i]); //[I@33909752 [I@55f96302 [I@3d4eac69
}