JAVA:设置addAll()vs使用循环添加

时间:2014-06-13 11:11:14

标签: java performance

我试图将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

3 个答案:

答案 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)