Java 在替换给定键的旧值时,put方法是否会增加“modCount”?

Java 在替换给定键的旧值时,put方法是否会增加“modCount”?,java,collections,hashmap,Java,Collections,Hashmap,在下面HashMap中put方法的实际实现代码中,我看到modCount仅在添加新条目时增加,但不确定它是否在替换旧值并为给定键插入新值的正常情况下增加。但我有一个理解,在hashmap结构改变的情况下,mod count会增加,即在添加、删除或更新映射内的值的情况下。有人能解释一下吗,因为我在代码中没有看到modCount在if部分内而不是在for循环外增加,所以它只是为了添加一个新的值,这个modCount会改变吗 public V put(K key, V value) { if (ke

在下面HashMap中put方法的实际实现代码中,我看到modCount仅在添加新条目时增加,但不确定它是否在替换旧值并为给定键插入新值的正常情况下增加。但我有一个理解,在hashmap结构改变的情况下,mod count会增加,即在添加、删除或更新映射内的值的情况下。有人能解释一下吗,因为我在代码中没有看到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或以其他方式修改其内部结构,例如。, *重播。此字段用于在的集合视图上生成迭代器 *哈希映射失败得很快。请参阅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的结构,也不会导致map的重新灰化

注意:-即使是您提供的代码示例,您也可以注意到,如果它是现有键,那么它将替换该值并返回旧值,这是put方法的返回值。so line modCount++;不会被执行


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

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

/** *此哈希映射在结构上被修改的次数 *结构修改是指更改中映射数量的修改 *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的结构,也不会导致map的重新灰化

注意:-即使是您提供的代码示例,您也可以注意到,如果它是现有键,那么它将替换该值并返回旧值,这是put方法的返回值。so line modCount++;不会被执行

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

Java 8直截了当地说:

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

因此,当modCount保留映射的结构修改计数时,您的问题的答案是:不,在替换给定键的旧值的情况下,modCount不会增加。

Java 8字面上说:

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


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

modCount++不在if条件中,您可以在if条件中看到它?在调用此方法的任何情况下,modCount都会增加。如果键为null,则在putForNullKey方法中增加该键;如果键不为null,则在for循环完成后增加该键。我不确定我是否理解您的问题,但只要看看方法,put.modc的modCount在任何情况下都会增加
ount++不在if条件中,您可以在if条件中看到它?modCount在调用此方法的任何情况下都会增加。如果键为null,则在putForNullKey方法中增加该键;如果键不为null,则在for循环完成后增加该键。我不确定我是否理解你的问题,但只要看看方法,modCount在任何情况下都会增加。