Java 陣列 淺拷貝與深拷貝
阿新 • • 發佈:2019-01-01
http://www.cppblog.com/baby-fly/archive/2010/11/16/133763.html
定義一個數組int[] a={3,1,4,2,5}; int[] b=a; 陣列b只是對陣列a的又一個引用,即淺拷貝。如果改變陣列b中元素的值,其實是改變了陣列a的元素的值
要實現深度複製,可以用clone或者System.arrayCopy
如下面的程式碼
2 int[] b=a.clone();
3 b[0]=10;
4 System.out.println(b[0]+""+a[0]);
輸出為10 3
可見改變了b的值,但是沒有改變a的元素的值
但是clone和System.arrayCopy都是對一維陣列的深度複製。對於二維陣列
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函式時,是對這兩個引用進行了複製。
要證明,只需看下面的輸出
2 int[][] b=a.clone();
3 b[0][0]=10;
4 System.out.println(b[
5 System.out.println(a[0]==b[0]);
第5句輸出為true。
用clone對二維陣列進行復制,要在每一維上呼叫clone函式
2 int[][] b=newint[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