簡體   English   中英

HashMap的迭代器是否安全?

[英]Is iterator of HashMap fail-safe?

我正在閱讀HashMap的屬性。 並找到了關於投票率很高的答案,其中說:

HashMap中的迭代器是故障安全的,而Hashtable的枚舉器則不是。

雖然JavaDoc說

所有此類的“集合視圖方法”返回的迭代器都是快速失敗的:

實際上,該答復的投票數使我感到困惑。 否則,我認為這只是快速失敗。

有人可以解釋嗎?

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.

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