[英]Is iterator of HashMap fail-safe?
HashMap的迭代器是快速失敗的,如果在對其進行迭代時嘗試進行修改,則它將拋出ConcurrentModificationException,而“ java.util.concurrent”程序包下的集合具有故障安全的迭代器。 您可以在迭代集合的同時對其進行修改。 主要用於多線程環境
是的,您的理解是正確的。
失敗快速 :通過積極地進行檢查來盡快失敗。 HashMap
的迭代器是快速失敗的,因為一旦它檢測到基礎結構的更改,它就會引發ConcurrentModificationException
。
我認為這只是快速失敗。
你是對的。 撰寫《答案》的人可能不了解故障快速和故障安全之間的區別。
實際上,該答復的投票數使我感到困惑。
很多票並不一定意味着SO Answer是正確的。 我也發現該答案還有其他一些問題。 IMO,它不配收到大量的贊譽。
不幸的是,人們出於各種原因對答案投票,這可能導致各種異常。
許多讀者對他們希望閱讀的內容做出反應,而忽略了細微的差異。 您鏈接的答案實際上解釋了快速失敗的含義,因此只有一個單詞與此處不匹配:“故障安全”與“快速失敗”。
另一點是,許多人接受聽起來似乎合理的答案。 我猜,沒有人真正測試過Hashtable
的枚舉器的行為是否真的與HashMap
的迭代器不同。 從我剛剛檢查的版本1.6.0_35開始,這兩種方法都試圖快速失敗。
好吧,我對此也感到困惑,但實際上這很簡單:
說我們有:
Hashtable<String, Integer> ht = new Hashtable<String, Integer>();
HashMap<String, Integer> hm = new HashMap<String, Integer>();
然后對於hm,我們可以執行hm.keySet()。iterator(),該函數返回迭代器並且快速失敗; 而對於ht,我們都可以執行ht.keySet()。iterator並返回快速失敗的迭代器,也可以執行ht.keys()返回枚舉對象但並非快速失敗的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.