亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對本示例中 ConcurrentHashMap 和 HashMap 行為之間的區別感到困惑

對本示例中 ConcurrentHashMap 和 HashMap 行為之間的區別感到困惑

牧羊人nacy 2022-06-23 20:00:27
我試圖了解 ConcurrentHashMap 的工作原理。我找到了一個例子,但我無法理解。這是它的代碼:Map<String, Object> myData = new HashMap<String, Object>();myData.put("A", 1);myData.put("B", 2);for (String key : myData.keySet()) {    myData.remove(key);}這將在運行時拋出異常ConcurrentModificationException。但是,此代碼使用ConcurrentHashMap將正常工作:Map<String, Object> myData = new ConcurrentHashMap<String, Object>();myData.put("A", 1);myData.put("B", 2);for (String key : myData.keySet()) }    myData.remove(key);}有人可以向我解釋為什么 ConcurrentHashMap 允許在 HashMap 引發異常時刪除鍵嗎?謝謝
查看完整描述

1 回答

?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

這只是 的功能之一ConcurrentHashMap。引用文檔:


類似地,迭代器、拆分器和枚舉返回反映哈希表在創建迭代器/枚舉時或之后的某個時間點的狀態的元素。它們不會拋出 ConcurrentModificationException。


ConcurrentHashMap但是,并沒有真正這樣做來支持您的用例。這樣做是為了允許一個線程中的迭代與其他線程中的修改同時發生。


如果這是您使用的唯一原因ConcurrentHashMap,那么您可能應該重新考慮,因為它比HashMap. 你最好在使用它之前制作一個密鑰集的副本,如下所示:


Map<String, Object> myData = new HashMap<String, Object>();

myData.put("A", 1);

myData.put("B", 2);

for(String key: myData.keySet().toArray(new String[0]))

    myData.remove(key); 


查看完整回答
反對 回復 2022-06-23
  • 1 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號