我的当前代码正在使用for-each Java5循环迭代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()?
发布于 2014-04-09 03:14:04
为什么我应该更改代码以使用显式迭代器并运行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;
}https://stackoverflow.com/questions/22952061
复制相似问题