1. 程式人生 > >Java 陣列 淺拷貝與深拷貝

Java 陣列 淺拷貝與深拷貝

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
如下面的程式碼

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=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