我一直对Java容器的复制构造函数是浅复制还是深复制感到困惑?
以下是我的理解:
ints1,ints2,ints3是引用,因此它们位于堆栈中。
inst1指向堆中的某个对象,该对象包含位于堆栈中的三个匿名引用,并且它们分别指向int值分别为0、1、2的对象。

ints2 = ints1

因此ints2指向与ints1相同的对象。因此,ints2中的防御所指向的更改对象将影响ints2中的对象。
ints2.set(1,0+10)

将更改inint1.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]

最佳答案

答案是:浅拷贝。看看这篇文章,它提供了有关该主题的更多详细信息:http://javarevisited.blogspot.co.uk/2014/03/how-to-clone-collection-in-java-deep-copy-vs-shallow.html?m=1

07-25 23:58