2012-06-12 53 views

回答

5

迭代器維護對基礎集合的引用。如果添加或刪除元素,則迭代器可能會留在不可能的索引處,或者集合可能會更改迭代器的「下方」。

因此,當您嘗試在迭代過程中修改集合時,大多數集合不會讓迭代器受到損壞,而是在您嘗試在迭代時修改集合時引發ConcurrentModificationException,因此您不會發現具有不可預知的損壞的迭代器。

0

當然,迭代器有一個鏈接到底層集合,這避免了副本。如果您在ArrayList迭代器(ListItr)的源代碼中尋找示例,則會看到它主要包含指向列表和遊標的鏈接。

所以,不要在線程之間共享迭代器,也不要修改迭代的集合。

2

通過契約,您不能在迭代時修改集合(除了使用Iterator.remove()等)。

當您這樣做時,該集合不會隨機失敗,而是可以跟蹤修改的次數,並在檢測到併發修改時拋出ConcurrentModificationException

1

ConcurrentModificationException可能是你的朋友,你應該學會忍受它。但是,爲了完整性:

那裏有非Oracle集合,不會拋出ConcurrentModificationException。他們更快(因爲他們不花時間檢查),顯然,更靈活,但使用時需要更加小心。

Oracle有四個(最後一個計數)「併發」類,它們不會在java.util.concurrent(ConcurrentHashMap,ConcurrentLinkedQueue,ConcurrentSkipListMap和ConcurrentSkipListSet)中拋出它。它們比非並行等價物稍微慢一些,但它們是線程安全的它們不要阻止。他們不會加擾你的數據,無論你做什麼什麼,但他們不會停止從擾亂它。

1

,拆卸,您可以使用iterator.remove(),如下所示:

for (Iterator iterator = list.iterator(); iterator.hasNext();) { 
Object object = iterator.next(); 
    /* ... */ 
    if (condition) { 
     iterator.remove(); 
    } 

對於添加你可以取代的ListIterator簡單的迭代器,如下

ListIterator<Object> iterator = list.listIterator(); 
iterator.add(new Object()); 
+0

迭代器不會有加方法,接下來只有3個方法,hasnext,remove。 – banjara

+0

您應該使用ListIterator而不僅僅是Iterator類型 – Moesio

相關問題