昨天寫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("");
}
}
}