簡體   English   中英

如果HashSet,ArrayList返回的迭代器是快速失敗的,我們如何使用迭代器remove()從Collection中刪除元素

[英]If Iterators returned by HashSet, ArrayList are fail-fast, how can we use iterator remove() to remove elements from Collection

眾所周知, ArrayListHashMapHashSet等返回的Iterator是快速失敗的,但是在使用迭代器的remove()不會拋出ConcurrentModificationException 怎么樣?

如果在迭代集合時對其進行了修改,則快速失敗迭代器將引發ConcurrentModificationException 但是,在使用迭代器的remove()ArrayListHashSet刪除元素時,不會引發任何ConcurrentModificationException 請詳細說明。

謝謝

但是在使用迭代器的remove()時不會引發ConcurrentModificationException。 怎么樣?

因為該行為已明確記錄。

對於ArrayList

如果在創建迭代器之后的任何時間對列表進行結構修改,除非通過迭代器自己的removeadd方法,否則迭代器將拋出ConcurrentModificationException

對於HashSet

如果在創建迭代器之后的任何時候修改了集合,則除了通過迭代器自己的remove方法以外,都以其他方式修改了該迭代器,則Iterator拋出ConcurrentModificationException

相反,如果您詢問如何實現 ,那么,源代碼(至少對於OpenJDK是免費的)(並且很可能直接從您的IDE中探索):)

它的實現如下:

集合包含一個private int成員,稱為modificationCount (或類似的東西)。每次您使用修改集合的方法之一時,此modificationCount都會增加。 在集合上創建迭代器時,迭代器會注意到該集合的modificationCount的當前值,並且每次調用該迭代器時,請確保modificationCount未被更改,以確保未修改集合。同時進行迭代。 如果迭代器發現modificationCount已更改,則拋出ConcurrentModificationException

當您通過iterator刪除時, iterator將避免增加集合的modificationCount 就這么簡單。

暫無
暫無

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

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