簡體   English   中英

您確切地表示HashMap的迭代器是快速失敗而HashTable的枚舉器不是嗎?

[英]What do you exactly mean by HashMap's iterator is fail-fast and HashTable's enumerator isn't?

我一直在查找這兩個類之間的區別,並且此博客的出處是很多答案,這是我的博客: http : //javarevisited.blogspot.com/2010/10/difference-between-hashmap-and。 html

但是我不完全明白。 有人可以詳細說明嗎? 也許舉個例子?

感謝您的光臨!

快速失敗是指當您嘗試遍歷內容時嘗試對其進行修改時,該內容將失敗並拋出ConcurrentModificationException。

Set keys = hashMap.keySet();
for (Object key : keys) {
    hashMap.put(someObject, someValue); //it will throw the ConcurrentModificationException here
} 

對於HashTable枚舉:

 Enumeration keys = hashTable.keys();
 while (keys.hasMoreElements()) {
          hashTable.put(someKey, someValue);  //this is ok
    }

在調用iterator.next() ,如果在創建迭代器與調用next()之間進行了任何修改,則會立即引發ConcurrentModificationException。 這就是快速失敗的意思。

Hashtable返回的Enumerations沒有此行為。 他們假設您知道自己在做什么,並且如果在使用其枚舉之一對其進行迭代時修改地圖,則他們的行為AFAIK是未定義的。

最好的方法是查看由每個類的Open JDK實現實現的每個類的源。 這樣,您可以直接從馬的嘴里得到答案,就像是:-)

除此之外,從本質上講,“快速失敗”意味着在HashMap上進行迭代的Iterator如果檢測到另一個線程已修改了目標HashMap,則將引發異常-如果在HashMap的源代碼中查找,則為只需檢查計數器中預期修改的數量即可完成。 如果修改計數與Iterator期望的計數不同,則意味着自上次檢查以來其他人進入並與HashMap混為一談,因此Iterator拋出ConcurrentModificationException

一個“非快速失敗”的迭代器不會費心檢查,並且很高興在基礎數據結構中處理它。 因此,您獲得了一定的靈活性(在這種情況下可能是不確定的靈活性),以換取以后可能會遇到錯誤。 即嘗試訪問不再存在的值。

與所有故障快速策略一樣,其思想是越早發現錯誤,恢復或調試就越容易。

暫無
暫無

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

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