clone():ArrayList.clone()我认为是一个浅拷贝

Tim*_*oad 20 java clone

ArrayList<Integer> a=new ArrayList<Integer>();
a.add(5);
ArrayList<Integer> b=(ArrayList<Integer>)a.clone();
a.add(6);
System.out.println(b.toString());
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我认为clone()是一个浅薄的副本.所以,ba应指向同一个内存位置.但是,当我这样做时b.toString(),答案是唯一的5.6如果clone()浅拷贝,为什么也不显示?

Boz*_*zho 50

浅拷贝并不意味着它们指向相同的内存位置.那只是一个任务:List b = a;.

克隆创建一个实例,包含相同的元素.这意味着您有2个不同的列表,但它们的内容是相同的.如果更改第一个列表中对象的状态,它将在第二个列表中更改.(因为你使用的是不可变类型Integer- 你无法观察到这一点)

但是,您应该考虑不使用clone().它适用于集合,但通常它被认为是破碎的.使用copy-constructors - new ArrayList(originalList)

  • 为了扩展@JoãoPortela所说的内容,深层复制会导致所有对象被复制.您有一个新的容器对象,其中的所有对象也是重复的.但请注意,这些对象(在集合中)中包含的对象可能不会重复.您必须确保每个对象都正确实现深层复制.如果操作正确,则从N个对象转到2N个对象. (2认同)

And*_*s_D 6

如果像你想,那么clone方法完全没用的,因为在这种情况下,下面的行是等价的:

ArrayList<Integer> b = (ArrayList<Integer>)a.clone();
ArrayList<Integer> b = a;
Run Code Online (Sandbox Code Playgroud)

克隆是 - 就像在现实世界中的场景一样 - 创建具有完全相同属性的两个实体的过程(在克隆操作时).

正如Bozho所说 - 避免使用Java clone()概念.即便是作者提到,它也被打破了.

这个问题及其答案非常有价值,并提供了一个链接到Josh Blochs自己对他的工作的评论;-)