[英]ConcurrentModification exception using addAll over Set in Java
[英]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.