2016-09-14 54 views
0

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

+0

http://stackoverflow.com/questions/11833058/modcount-in-map-and-list modCount是地图被修改的次数。至于是否可以用'boolean'完成同样的事情......也许,但这是一个内部领域。只有JDK开发者才能提供真正的解释。 – Tunaki

回答

5

修改计数而不是布尔值让多个迭代器可以跟踪它们是否有效。

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

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()不会失败。

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

相关问题