在下面的代码(HashMap中的put方法的实际实现)中,我看到仅在添加新条目的情况下modCount才会增加,但不确定在替换旧值并为a插入新值的正常情况下modCount是否会增加。给定密钥。但是我了解到,如果hashmap结构发生变化(即在地图内部添加,删除或更新值),则mod计数会增加。有人可以解释一下吗,正如我在代码中没有看到的那样,modCount在if部分内部而不是在for循环之外递增(因此,它仅用于添加新值,此modCount会发生变化)吗?

public V put(K key, V value) {
 if (key == null)
     return putForNullKey(value);
  int hash = hash(key.hashCode());
  int i = indexFor(hash, table.length);
  for (Entry<K,V> e = table[i]; e != null; e = e.next) {
       Object k;
       if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
           V oldValue = e.value;
           e.value = value;
           e.recordAccess(this);
           return oldValue;
       }
  }
  modCount++;
  addEntry(hash, key, value, i);
  return null;
}

最佳答案

下面直接从hashmap.java类的modcount的javadoc复制:


  / **
       *此HashMap被结构修改的次数
       *结构修改是指那些更改了
       * HashMap或以其他方式修改其内部结构(例如,
       *重新哈希)。此字段用于在以下对象的“收藏夹”视图上进行迭代
       * HashMap故障快速。 (请参阅ConcurrentModificationException)。
       * /


因此,如果您替换密钥的旧值,并且我使用的是Java-8,则Modcount不会更改,下面是一段代码,用于替换现有密钥的值:-

if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }


在上面的行之后,modcount ++增加了,但是请注意,这里我们正在返回,并查看注释//现有的键映射。
因此,要回答您的问题,在将值替换为现有键的情况下,modcount不会增加,因为它既不会更改哈希映射的结构,也不会导致映射的重新哈希。

注意:-即使您在此处提供的代码示例也可以注意到,如果它对于现有键,则替换值并返回旧值,这是put方法的返回值。因此,行modCount ++;将不会执行。

希望我很清楚,如果您有任何疑问,请告诉我。

关于java - 如果替换给定键的旧值,put方法是否会增加“modCount”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44967369/

10-10 18:07