迭代ConcurrentHashmap

时间:2014-04-09 03:09:44

标签: java concurrency hashmap java.util.concurrent concurrenthashmap

我当前的代码是使用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()

2 个答案:

答案 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,它是故障安全迭代器。您可以编辑条目集 - 迭代时放置/删除。