定義一個(gè)數(shù)組int[] a={3,1,4,2,5}; int[] b=a; 數(shù)組b只是對(duì)數(shù)組a的又一個(gè)引用,即淺拷貝。如果改變數(shù)組b中元素的值,其實(shí)是改變了數(shù)組a的元素的值
要實(shí)現(xiàn)深度復(fù)制,可以用clone或者System.arrayCopy
如下面的代碼
1 int[] a={3,1,4,2,5};
2 int[] b=a.clone();
3 b[0]=10;
4 System.out.println(b[0]+" "+a[0]);
輸出為10 3
可見改變了b的值,但是沒有改變a的元素的值
但是clone和System.arrayCopy都是對(duì)一維數(shù)組的深度復(fù)制。對(duì)于二維數(shù)組
1 int[][] a={{3,1,4,2,5},{4,2}};
2 int[][] b=a.clone();
3 b[0][0]=10;
4 System.out.println(b[0][0]+" "+a[0][0]);
輸出為10 10
所以clone并不能直接作用于二維數(shù)組
因?yàn)閖ava中沒有二維數(shù)組的概念,只有數(shù)組的數(shù)組。所以二維數(shù)組a中存儲(chǔ)的實(shí)際上是兩個(gè)一維數(shù)組的引用。當(dāng)調(diào)用clone函數(shù)時(shí),是對(duì)這兩個(gè)引用進(jìn)行了復(fù)制。
要證明,只需看下面的輸出
1 int[][] a={{3,1,4,2,5},{4,2}};
2 int[][] b=a.clone();
3 b[0][0]=10;
4 System.out.println(b[0][0]+" "+a[0][0]);
5 System.out.println(a[0]==b[0]);
第5句輸出為true。
用clone對(duì)二維數(shù)組進(jìn)行復(fù)制,要在每一維上調(diào)用clone函數(shù)
1 int[][] a={{3,1,4,2,5},{4,2}};
2 int[][] b=new int[a.length][];
3 for(int i=0;i<a.length;i++){
b[i]=a[i].clone();
}
b[0][0]=10;
6 System.out.println(b[0][0]+" "+a[0][0]);
7 System.out.println(b[0]==a[0]);
輸出為
10 3
false