CHM没有ConcurrentModificationException。为什么?

时间:2014-04-03 04:28:15

标签: java map hashmap hashcode concurrenthashmap

我最近做了一个例子,我在迭代它时将元素添加到ConcurrentHashMap

代码段 -

Map<String, String> map = new ConcurrentHashMap<String, String>();
map.put("ABC", "abc");
map.put("XYZ", "xyz");
map.put("MNO", "mno");
map.put("DEF", "def");
map.put("PQR", "pqr");

Iterator<Map.Entry<String, String>> entrySet = map.entrySet().iterator();
while(entrySet.hasNext()) {
        Map.Entry<String, String> entry = entrySet.next();
        System.out.println(entry.getKey()+", "+entry.getValue());
        map.put("TQR", "tqr");
}

但是我无法找到确切的原因,为什么代码在CHM的情况下不会抛出ConcurrentModificationException。

简而言之,与HashMap不同,CHM不会抛出ConcurrentModificationException。

谢谢!

1 个答案:

答案 0 :(得分:9)

ConcurrentHashMap API声明其迭代器不会抛出ConcurrentModificationException。这是因为它的迭代器反映了迭代器创建时哈希表的状态。这就像它的迭代器使用哈希表快照一样:

    ConcurrentHashMap m = new ConcurrentHashMap();
    m.put(1, 1);
    Iterator i = m.entrySet().iterator();
    m.remove(1);        // remove entry from map      
    System.out.println(i.next()); //still shows entry 1=1