put方法是否会增加" modCount"在替换给定密钥的旧值的情况下?

时间:2017-07-07 09:32:08

标签: java collections hashmap

在下面的代码中(在HashMap中实际执行put方法),我看到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;
}

2 个答案:

答案 0 :(得分:3)

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

  

/ **        *此HashMap经过结构修改的次数        *结构修改是那些改变映射数量的修改        * HashMap或以其他方式修改其内部结构(例如,        * rehash)。该字段用于在Collection-views上创建迭代器        * 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不是在值被替换为现有键的情况下增加,因为它既不会改变hashmap的结构,也不会导致地图的重新散列。

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

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

答案 1 :(得分:2)

Java 8 HashMap docs字面上说(强调我的):

  

请注意,此实现未同步。如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作; 仅更改与实例已包含的键关联的值不是结构修改。)

因此,当modCount保留对地图的结构修改计数时,您的问题的答案是:否,modCount在替换给定键的旧值时不会增加。