在java.util.HashMap中,为什么modcount不是布尔值?
在java.util.HashMap中,成员变量modCount似乎主要用于检测concurrentmodification。在java.util.HashMap中,为什么modcount不是布尔值?,java,hashmap,Java,Hashmap,在java.util.HashMap中,成员变量modCount似乎主要用于检测concurrentmodification。 那么,保持该变量为int的必要性是什么?这不能通过bool实现吗?具有修改计数,而不是布尔值,让多个迭代器同时跟踪它们是否有效 如果使用布尔值跟踪修改,那么所有迭代器都需要处于相同的有效状态。计数让迭代器知道在创建迭代器时发生了多少修改。因此,如果使用时的修改次数不同,它就会知道它是无效的。这允许一些迭代器是有效的,而一些是无效的,所有这些都不需要手动更新每个迭代器的有
那么,保持该变量为int的必要性是什么?这不能通过bool实现吗?具有修改计数,而不是布尔值,让多个迭代器同时跟踪它们是否有效
如果使用布尔值跟踪修改,那么所有迭代器都需要处于相同的有效状态。计数让迭代器知道在创建迭代器时发生了多少修改。因此,如果使用时的修改次数不同,它就会知道它是无效的。这允许一些迭代器是有效的,而一些是无效的,所有这些都不需要手动更新每个迭代器的有效性。如果您有一个布尔值,这意味着在调用迭代器之前,您必须将其设置为
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();
Iterator-keyterator=map.keySet().Iterator();
...
keyterator.next();
...
map.put(键、值);
迭代器pairIterator=map.entrySet().Iterator();
...
keyterator.next();
现在,对map.EntrySet().iterator()
必须清除布尔标志。因此,keyinterator.next()
不会失败
使用整数可以避免这个问题,因为没有一个迭代器实际更改映射的状态-只有修改操作才更改。保留“旧值”的变量保留在本地,因此不会干扰其他读取器。modCount是地图被修改的次数。至于是否可以用布尔值做同样的事情。。。也许吧,但这是一个内部领域。也许只有JDK开发人员能够提供真正的解释。