昨天写Java的时候写了一行int[][] c = a.clone(),结果发现后续对c的操作同时也作用到了a上了,当时一脸懵逼啊,说好的clone呢,怎么引用又扯不干净了。单步调试看看,好家伙,还真的是……
今天上网查了查,原来因为Java跟C/C++一样,没有二维数组,二维数组是一维数组的一维数组,用int[][] c = a.clone(),实际上是把a[0],a[1],a[2]给clone了一份给c,也就是把每一行的一维数组的引用拷贝了一份给c,但是这些引用所指向的内存空间还是原来那一块,并不是彻底的深拷贝,在后续对c的操作中还是会同时作用在a上。因此应该对每一行的一维数组分别进行clone,才是彻底的深拷贝。
测试代码:
package package2;
public class Test {
public static void main(String[] args) {
int[][] a = new int[3][3];
int cnt = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
a[i][j] = ++cnt;
}
}
int[][] b = new int[3][];
for (int i = 0; i < 3; i++) {
b[i] = a[i].clone();
}
b[0][0] = -1;
System.out.println("a:");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println("");
}
System.out.println("");
System.out.println("b:");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(b[i][j] + " ");
}
System.out.println("");
}
System.out.println("");
int[][] c = a.clone();
c[0][0] = -2;
System.out.println("a:");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println("");
}
System.out.println("");
System.out.println("c:");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(c[i][j] + " ");
}
System.out.println("");
}
}
}