簡體   English   中英

JAVA:設置addAll()vs使用循環添加

[英]JAVA : Set addAll() vs adding using loop

我試圖將2個集合中的整數添加到單個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

在你做任何事之前一定要確保你已經閱讀並理解了這里的討論: Java基准測試 - 為什么第二個循環更快?

我希望addAll在某些情況下更快,因為它有更多的信息可以使用。

例如,在ArrayList上,addAll可以確保它分配足夠的空間來在一個步驟中添加每個元素,而不是在添加大量元素時重新分配多次。

它肯定不會慢,因為即使是一個天真的實現它只會做你做的事情,循環添加項目。

檢查addAll方法的實現 - 與你做的事情沒什么不同 - AbstractCollection代碼

關於如何在內部處理它的問題,只需檢查可用的源代碼,例如在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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM