2017-12-18 574 views
3

我一直很困惑Java容器的拷貝構造函數是淺拷貝還是深拷貝? 以下是我的理解: ints1,ints2,ints3是引用,因此它們位於堆棧中。 inst1指向堆中的某個對象,並且此對象包含三個位於堆棧中的匿名引用,並且它們指向分別具有int值0,1,2的對象。Java ArrayList的拷貝構造函數是淺拷貝還是深拷貝?

ints2 = ints1 

so ints2指向與ints1相同的對象。因此,改變ints2中的反對者所指向的對象將會影響ints2中的那些對象。

ints2.set(1,0+10) 

將改變retsnence ints1.get(0)的對象。

ints3 = new ArrayList<>(ints1) 

接下來是我的困惑。

如果複製構造函數是淺拷貝,那麼雖然ints1和ints3指向不同的對象,但兩個對象具有相同的引用!因此,通過在ints1中操作引用來更改對象的任何操作都會更改ints3,因爲它們指向的是相同的對象。

如果複製構造函數是深度複製,則ints1和ints3將包含不同的引用並指向不同的對象。然後ints1的變化不會影響ints3。

根據結果,似乎複製構造函數是深拷貝,而不是淺拷貝。

希望有人能糾正我,謝謝。

import java.util.*; 
public class MyClass { 
    public static void main(String args[]) { 
     List<Integer> ints1 = new ArrayList<>(Arrays.asList(0,1,2)); 
     System.out.println(ints1); 
     List<Integer> ints2 = ints1; 
     ints2.set(0,0+10); 
     System.out.println(ints1); 
     List<Integer> ints3 = new ArrayList<>(ints1); 
     ints3.set(1,1+10); 
     System.out.println(ints1); 
    } 
} 
result 
[0, 1, 2] 
[10, 1, 2] 
[10, 1, 2] 
+2

不要混淆整數的不變性與淺與深的副本。請閱讀以下內容:https://yunmingzhang.wordpress.com/2014/01/08/making-shallow-copies-for-java-arraylist-collections-objects/ – Jason

+1

ints1和ints2引用的是相同的對象,而ints3是使用ints1中的值創建的單獨對象。因此,ints2中的任何更改都會更改ints1。但ints3的變化不會影響其他兩個對象..如果你有困惑嘗試打印所有對象的哈希碼,你可以看到不同之處.. –

回答