在java.util.HashMap中,为什么modcount不是布尔值?

时间:2016-09-14 14:33:27

标签: java hashmap

在java.util.HashMap中,成员变量modCount似乎主要用于检测并发修改。 那么将变量保持为int的需要是什么,不能用bool来实现?

2 个答案:

答案 0 :(得分:5)

具有修改计数而不是布尔值,允许多个迭代器跟踪它们是否有效。

如果使用布尔值跟踪修改,则所有迭代器都需要处于相同的有效状态。计数允许迭代器知道创建时发生了多少修改。因此,如果使用它时的修改次数不同,那么它知道它的无效。这允许一些迭代器有效而一些迭代器无效,所有这些都不需要手动更新每个迭代器的有效性。

答案 1 :(得分:2)

如果你有一个布尔值,那就意味着在调用迭代器之前你必须将它设置为false,当你完成时,你要检查它是否是true,对吧?

但是如果你这样做,并且创建了两个迭代器,或者创建了一个迭代器并调用了forEach方法,那么第二个迭代器将再次重置该变量。

Iterator<K> keyIterator = map.keySet().iterator();
...
keyIterator.next();
...
map.put(key,value);

Iterator<Map.Entry<K,V>> pairIterator = map.entrySet().iterator();
...
keyIterator.next();

现在,对keyIterator.next()的最后一次调用应该失败,因为中间有map.put(key,value)调用。但是如果我们通过重置布尔值来工作,那么map.EntrySet().iterator()必须清除布尔标志。因此,keyIterator.next()不会失败。

使用整数可以避免这个问题,因为没有一个迭代器实际上改变了映射的状态 - 只有修改操作才会这样做。保持“旧值”的变量保存在本地,因此不会干扰其他读者。