【发布时间】:2018-07-14 09:01:27
【问题描述】:
我刚刚读到人们认为的 ArrayList 的深拷贝
new ArrayList<>(originalList);
将创建一个浅拷贝。而且我写了一个小demo
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 的拷贝构造函数没那么浅。那为什么人们会这样说?是否有某些级别的深拷贝? 非常感谢!
【问题讨论】:
-
结果与执行浅拷贝完全一样。您的预期输出是什么,为什么?
-
你对浅层和深层的定义似乎不同。浅拷贝意味着只复制对列表内对象的引用。这就是发生的事情。深拷贝意味着列表中的对象本身被复制(即,如果您愿意,可以克隆),并且副本将存储到新列表中。
-
在 Java 中 String 类的实例应该是不可变的。您如何观察不可变对象集合的浅拷贝和深拷贝之间的区别?
-
@PeterT 与
==... -
@PeterT 知道了,demo 应该是可变对象,tks
标签: java arraylist copy-constructor deep-copy