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()是一个浅薄的副本.所以,b并a应指向同一个内存位置.但是,当我这样做时b.toString(),答案是唯一的5.6如果clone()浅拷贝,为什么也不显示?
Boz*_*zho 50
浅拷贝并不意味着它们指向相同的内存位置.那只是一个任务:List b = a;.
克隆创建一个新实例,包含相同的元素.这意味着您有2个不同的列表,但它们的内容是相同的.如果更改第一个列表中对象的状态,它将在第二个列表中更改.(因为你使用的是不可变类型Integer- 你无法观察到这一点)
但是,您应该考虑不使用clone().它适用于集合,但通常它被认为是破碎的.使用copy-constructors - new ArrayList(originalList)
如果是像你想,那么clone方法就完全没用的,因为在这种情况下,下面的行会是等价的:
ArrayList<Integer> b = (ArrayList<Integer>)a.clone();
ArrayList<Integer> b = a;
Run Code Online (Sandbox Code Playgroud)
克隆是 - 就像在现实世界中的场景一样 - 创建具有完全相同属性的两个实体的过程(在克隆操作时).
正如Bozho所说 - 避免使用Java clone()概念.即便是作者提到,它也被打破了.
这个问题及其答案非常有价值,并提供了一个链接到Josh Blochs自己对他的工作的评论;-)
| 归档时间: |
|
| 查看次数: |
67109 次 |
| 最近记录: |