2013-12-20 28 views
2

我首先克隆了一維原始數組(它將保存包裝),然後更改克隆數組的第一個值。但是原始數組的第一個值沒有改變。然後我克隆了一個二維數組,並做了同樣的操作(改變了數組[0] [0]值)。其值爲originalArray [0] [0]也被改變了。爲什麼發生這種情況。這是由於淺拷貝和深拷貝?當克隆一維數組和二維數組時,發生了什麼不同

我的一維數組例如

int[] arr=new int[2]; 
    arr[0]=1; 
    arr[1]=2; 

    int[]arrnew=arr.clone(); 
    System.out.println(arr[0]); 
    System.out.println(arrnew[0]); 
    arr[0]=5; 
    System.out.println(arr[0]); 
    System.out.println(arrnew[0]); 

我的二維數組例如

 int[][] arr=new int[2][2]; 
     arr[0][0]=1; 
     arr[0][1]=2; 
     arr[1][0]=3; 
     arr[1][1]=4; 
     int[][] arrnew=arr.clone(); 
     System.out.println(arr[1][0]); 
     System.out.println(arrnew[1][0]); 
     arr[1][0]=5; 
     System.out.println(arr[1][0]); 
     System.out.println(arrnew[1][0]); 

回答

4

這是由於淺拷貝和深拷貝?

是。 clone()只執行淺拷貝。

克隆方法複製第一維的內容。在第一個例子中,數組只有1維並且由整數組成(這是一個值類型),所以所有整數都被複制。這仍然是一個淺的副本。如果您對數組中的引用類型進行了相同的示例,則會看到與多維數組相同的行爲。

在第二個示例中,您有一個2維數組,它基本上是一個數組數組,因此「第一個數組」包含引用。克隆多維數組時,將複製對數組的引用,而不是這些數組的內容(因爲它不是深層副本)。

0

變化int[][] arrnew=arr.clone(); to int[][] arrnew=(int[][]) arr.clone();
它的行爲相同

+0

原因已經解釋MAV一維數組的情況下, –