2017-12-18 572 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的变化不会影响其他两个对象..如果你有困惑尝试打印所有对象的哈希码,你可以看到不同之处.. –

回答