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

我正在使用 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:two

c:three

W:five

four


MYYA
浏览 164回答 1
1回答

吃鸡游戏

这里的问题是你不明白弱一致迭代器在使用时代表什么keySet().iterator(),特别是文档的这一部分:它们保证遍历元素,因为它们在构造时就存在过一次,并且可能(但不保证)反映构造后的任何修改。想象一下这样的情况:您正在迭代 aConcurrentHashMap并打印它所拥有的任何内容。一旦你看到了某个桶并显示了它的所有元素,你就会移动到下一个,同时更新(假设你key-value向它添加一对)前一个。不会显示对前一个的更新,尽管它们确实存在。循环后,您可以执行以下操作:System.out.println(map);并看到现在一切都存在。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java