【发布时间】:2015-11-23 23:47:22
【问题描述】:
我的问题是基于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 作为new 对象,他应该这样做:
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());
?
【问题讨论】:
-
1.没关系。 2.如果真的很重要,你可以自己测试一下。 3. 除非您说的是数百万份/克隆,否则没关系。
-
那么,两者对于流程的复杂度“程度”是一样的吗?
-
是的,他们都是
O(n)。迭代器方法不太清楚。 -
实际上它们并不相同(嗯,在复杂性方面是的,但不是功能)。
ArrayList.clone();不会产生深度克隆。所以相当于一个简单的addAll()。 -
ArrayList.clone返回浅拷贝。foo2.addAll(foo1.clone())与foo2.addAll(foo1);的结果相同
标签: java arraylist iterator clone