定義一個數組int[] a={3,1,4,2,5}; int[] b=a; 數組b只是對數組a的又一個引用,即淺拷貝。如果改變數組b中元素的值,其實是改變了數組a的元素的值
要實現深度復制,可以用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都是對一維數組的深度復制。對于二維數組
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并不能直接作用于二維數組
因為java中沒有二維數組的概念,只有數組的數組。所以二維數組a中存儲的實際上是兩個一維數組的引用。當調用clone函數時,是對這兩個引用進行了復制。
要證明,只需看下面的輸出
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對二維數組進行復制,要在每一維上調用clone函數
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