我试图将2个集合中的Integers添加到单个Set via循环中,并使用Collections提供的addAll()方法。出于测试目的,我已经使用整数填充了2个集合,然后尝试将它们添加到第三个集合
Set<Integer> undId = new HashSet<Integer>();
Set<Integer> proxies = new HashSet<Integer>();
//Create 2 sets with Integers
for(int i=0;i<100;i++){
undId.add(i);
proxies.add(i);
}
和方法1://现在使用for循环将它们添加到第三组
for(Integer integer : undId)
underlyings.add(integer);
for(Integer integer :proxies)
underlyings.add(integer);
和方法2://或使用addAll()
将它们添加到第三组 underlyings.addAll(undId);
underlyings.addAll(proxies);
现在,当我尝试使用System.nanoTime()计时操作时,添加速度提高了两倍(对于100,1000,10000个元素)。当我将尺寸增加到1000000或10000000时。它被颠倒了。我想知道为什么会发生更大的集合。我不确定addAll()内部如何处理,但是理解上面的任何帮助都将受到赞赏。 Thnx
答案 0 :(得分:3)
在您做任何事情之前,请确保您已阅读并理解此处的讨论:Java benchmarking - why is the second loop faster?
我希望addAll在某些情况下更快,因为它有更多的信息可以使用。
例如,在ArrayList上,addAll可以确保它分配足够的空间来在一个步骤中添加每个元素,而不必在添加大量元素时多次重新分配。
它肯定不会慢,因为即使是一个天真的实现它只会做你做的事情,循环添加项目。
答案 1 :(得分:0)
检查addAll方法的实现 - 与您所做的事情没什么不同 - AbstractCollection code
答案 2 :(得分:0)
关于您如何在内部处理问题,请查看可用的源代码,例如:在eclipse中按住Ctrl并单击并找到实现,在您的情况下,该实现位于AbstractCollection
:
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
(来自JDK 1.7)