我当前的代码是使用for-each Java 5循环迭代ConcurrentHashMap。在下面的代码中,因为隐式迭代器是故障安全的,所以我不会遇到ConcurrentModificationException。
Map<Long,String> map = new ConcurrentHashMap <Long,String>();
map.put(1L, "1");
map.put(2L, "2");
System.out.println("map size before" + map.size());
for ( Long id : map.keySet()) {
map.remove(id);
}
System.out.println("map size after" + map.size());
我有什么理由要更改代码以使用显式迭代器并运行iterator.remove()
答案 0 :(得分:4)
我有什么理由要更改代码以使用显式迭代器并运行iterator.remove()
在封面下,CHM使用的迭代器调用map.remove(key)
本身。请参阅下面的代码。
也就是说,从迭代器中删除是正确的模式,如果可能的话,总是很好地使用常见的模式。例如,如果您复制代码以使用其他地图或将此代码中的地图降级为不是CHM,那么如果您使用迭代器,则代码不会中断。
abstract class HashIterator {
...
public void remove() {
if (lastReturned == null)
throw new IllegalStateException();
ConcurrentHashMap.this.remove(lastReturned.key);
lastReturned = null;
}
答案 1 :(得分:0)
除了它提供的并发功能之外,还有一个非常重要的功能以及concurrenthmp,它是故障安全迭代器。您可以编辑条目集 - 迭代时放置/删除。