我的问题基于这样的假设:ArrayList.addAll()
方法不会创建新对象,而是将相同的对象附加到ArrayList。
因此,为了addAll
个对象而且还有新对象,则必须进行构造。
例如,假设BooClass类使用深层副本实现Cloneable
接口,我们有:
ArrayList<BooClass> foo1 = new ArrayList<BooClass>();
for (int i = 0; i < 10; i++) foo1.add(new BooClass());
ArrayList<BooClass> foo2 = new ArrayList<BooClass>();
然后,如果有人想将foo1
的所有元素添加到foo2
作为新对象,他应该执行以下操作:
foo2.addAll(foo1.clone());
由于:
foo2.addAll(foo1);
会导致(?)foo1
和foo2
中包含相同的BooClass
个对象。
所以,如果以上是正确的,那么我的问题是两者中的哪一个更快:
Iterator<BooClass> itBoo = foo1.iterator();
while(itBoo.hasNext()) foo2.add(itBoo.next().clone());
或:
foo2.addAll(foo1.clone());
答案 0 :(得分:6)
两人不做同样的事情。
Iterator<BooClass> itBoo = foo1.iterator();
while(itBoo.hasNext()) foo2.add(itBoo.next().clone());
这将克隆BooClass
中的每个foo1
对象,并将克隆添加到foo2
。
尽管
foo2.addAll(foo1.clone());
克隆列表 foo1
,生成一个新的ArrayList,其中包含对相同BooClass对象ass foo1的引用,并将所有BooClass
个对象添加到foo2
。
克隆操作是完全没用的,顺便说一句,因为这与简单的操作具有相同的效果
foo2.addAll(foo1);
如果你想要深度克隆,最简单的方法是
List<BooClass> foo2 = new ArrayList<>(foo1.size());
for (BooClass boo : foo1) {
foo2.add(boo.clone());
}
请注意,clone()通常被认为是个坏主意。您通常应该更喜欢复制构造函数:
List<BooClass> foo2 = new ArrayList<>(foo1.size());
for (BooClass boo : foo1) {
foo2.add(new BooClass(boo));
}