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

Java 集合:地图在使用故障安全迭代器时得到更新

Java 集合:地图在使用故障安全迭代器时得到更新

MYYA 2021-10-28 17:31:45
我正在使用 Maps 分析故障安全迭代器并验证,如果我们正在更新密钥集,操作会发生在克隆还是实际地图上private static void failSafeIterator() {    ConcurrentHashMap<String, String> map=new ConcurrentHashMap<>();    map.put("a", "one");    map.put("b", "two");    Iterator<String> keyIterator=map.keySet().iterator();    while(keyIterator.hasNext()){        String key=keyIterator.next();        System.out.println(key+":"+map.get(key));        map.put("c", "three");        map.put("q", "four");        map.put("W", "five");    }    System.out.println(map.get("q"));}根据上面的代码片段,c、q 和 w 的添加应该发生在克隆而不是实际集合上但是我可以看到集合中发生的更新。此外,输出有点混乱,因为并非所有键值对都被打印出来,即使键存在于映射中。输出:a:one b:twoc:threeW:fivefour
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

这里的问题是你不明白弱一致迭代器在使用时代表什么keySet().iterator(),特别是文档的这一部分:

它们保证遍历元素,因为它们在构造时就存在过一次,并且可能(但不保证)反映构造后的任何修改。

想象一下这样的情况:您正在迭代 aConcurrentHashMap并打印它所拥有的任何内容。一旦你看到了某个桶并显示了它的所有元素,你就会移动到下一个,同时更新(假设你key-value向它添加一对)前一个。不会显示对前一个的更新,尽管它们确实存在。

循环后,您可以执行以下操作:

System.out.println(map);

并看到现在一切都存在。


查看完整回答
反对 回复 2021-10-28
  • 1 回答
  • 0 关注
  • 163 浏览

添加回答

举报

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