在迭代时清除ConcurrentHashMap中的元素

fud*_*udy 2 java dictionary concurrenthashmap

这是我对ConcurrentHashMap的测试

@Test
public void testIt2() {
    Map<String, String> map = new ConcurrentHashMap<String, String>();
    map.put("2", "2");
    map.put("1", "1");
    for (Entry<String, String> entry : map.entrySet()) {
        map.clear();
        System.out.println(entry.getKey());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1
2
Run Code Online (Sandbox Code Playgroud)

为什么?

And*_*lko 6

循环结束后,您可以看到更改.您可以再次打印出地图以查看差异.它会是空的.我想补充的一部分@waldheinz的答案:

如果在迭代时从地图中添加或删除值会发生什么?

如果你这样做,那么事情就不会破坏(这就是"并发"的ConcurrentHashMap意思).但是,无法保证一个线程会看到另一个线程执行的映射更改(无需从映射中获取新的迭代器).保证迭代器在创建时反映地图的状态.进一步的变化可能会反映在迭代器中,但它们并非必须如此.