我刚刚阅读了人们认为的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的副本构造函数并不那么浅。那为什么人们这么说呢?是否有一些深层副本? 非常感谢!
答案 0 :(得分:2)
您对“浅”和“深”副本的定义似乎是错误的。看来您认为浅表副本的意思是“复制对对象的引用”,如下所示:
List<String> copyNameList1=originalNameList;
“深层”副本会创建一个新的数组列表:
List<String> copyNameList2= new ArrayList<>(originalNameList);
请注意,以上是一个误解。
浅表副本实际上表示创建具有相同元素的新数组列表,而深表副本表示创建具有原始数组列表中元素副本的新数组列表。
这里最大的区别是“是否复制了数组列表中的元素”。
想象一下,您有一个数组列表对象a1
。它包含对3个三个对象obj1
,obj2
,obj3
的引用。
a1
的浅表副本将创建一个新的数组列表对象a2
,其中包含对相同obj1
,obj2
,obj3
对象的引用。 / p>
a1
的深层副本将创建一个新的数组列表对象a2
,其中包含对obj4
,obj5
,obj6
的引用,其中{{1 }},obj4
和obj5
分别是obj6
,obj1
和obj2
的副本。
以下两种方法可以显示浅拷贝和深拷贝中发生的情况:
obj3
通常,深层副本会复制目标对象所引用的对象。