【问题标题】:In java.util.HashMap, why modcount is not a boolean?在 java.util.HashMap 中,为什么 modcount 不是布尔值?
【发布时间】:2016-09-14 14:33:26
【问题描述】:

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

【问题讨论】:

标签: java hashmap


【解决方案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() 不会失败。

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

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-08
      • 1970-01-01
      • 2013-04-01
      • 2013-04-15
      • 1970-01-01
      • 2011-03-17
      相关资源
      最近更新 更多