复制数组列表的构造函数

时间:2018-07-14 09:01:28

标签: java arraylist copy-constructor deep-copy

我刚刚阅读了人们认为的ArrayList的深层副本

new ArrayList<>(originalList);

将创建一个浅表副本。我写了一个小演示

    ArrayList<String> originalNameList = new ArrayList<>(Arrays.asList("Anna", "Betty", "Chris"));
    List<String> copyNameList1=originalNameList;
    List<String> copyNameList2= new ArrayList<>(originalNameList);

    originalNameList.add("Duke");
    copyNameList1.add("Ellen");
    copyNameList1.set(1,"Bill");
    copyNameList2.set(0,"Andy");

    System.out.println("originalNameList = " + originalNameList);
    System.out.println("copyNameList1    = " + copyNameList1);
    System.out.println("copyNameList2    = " + copyNameList2);

结果:

originNameList = [Anna, Bill, Chris, Duke, Ellen]
copyNameList1  = [Anna, Bill, Chris, Duke, Ellen]
copyNameList2  = [Andy, Betty, Chris]

我觉得ArrayList的副本构造函数并不那么浅。那为什么人们这么说呢?是否有一些深层副本? 非常感谢!

1 个答案:

答案 0 :(得分:2)

您对“浅”和“深”副本的定义似乎是错误的。看来您认为浅表副本的意思是“复制对对象的引用”,如下所示:

List<String> copyNameList1=originalNameList;

“深层”副本会创建一个新的数组列表:

List<String> copyNameList2= new ArrayList<>(originalNameList);

请注意,以上是一个误解。

浅表副本实际上表示创建具有相同元素的新数组列表,而深表副本表示创建具有原始数组列表中元素副本的新数组列表。

这里最大的区别是“是否复制了数组列表中的元素”。

想象一下,您有一个数组列表对象a1。它包含对3个三个对象obj1obj2obj3的引用。

a1的浅表副本将创建一个新的数组列表对象a2,其中包含对相同obj1obj2obj3对象的引用。 / p>

a1的深层副本将创建一个新的数组列表对象a2,其中包含对obj4obj5obj6的引用,其中{{1 }},obj4obj5分别是obj6obj1obj2的副本。

以下两种方法可以显示浅拷贝和深拷贝中发生的情况:

obj3

通常,深层副本会复制目标对象所引用的对象。