Java中的列表中的clone方法 - 是浅拷贝还是深拷贝?

时间:2015-01-28 15:06:39

标签: list clone deep-copy shallow-copy

据我所知,当我使用为List提供的克隆方法时,或者如果我使用复制构造函数作为列表,我需要获得列表的浅表副本:

 ArrayList<String> a = new ArrayList<>();
 a.add(new String("dog"));
 a.add(new String("cat"));
 ArrayList<String> b = new ArrayList<String>(a);
 //ArrayList<String> b = (ArrayList<String>)a.clone();

b.remove(0);
Iterator<String> iter = a.iterator();
while(iter.hasNext()){
    System.out.println(iter.next());
}
Iterator<String> iter2 = b.iterator();
while(iter2.hasNext()){
    System.out.println(iter2.next());
} 



out put:
dog
cat
cat

如果b是a的浅表副本那么当我从b中删除一个元素时,它是如何从a中移除的?

1 个答案:

答案 0 :(得分:0)

因为b是一个单独的列表,它是通过复制a中的项目而创建的。

它是浅拷贝的事实意味着a内的项目没有被克隆;它们指的是相同的对象。深层复制意味着列表和列表中的项目都将被克隆。但在这两种情况下,列表本身都是克隆的,因此它们现在是两个不同的对象。