Java中對於二維數組的clone

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章