我最近做了一个例子,我在迭代它时将元素添加到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。
谢谢!
答案 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