为了账号安全,请及时绑定邮箱和手机立即绑定

对本示例中 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 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信