gpt4 book ai didi

java - 如果替换给定键的旧值,put 方法是否会增加 "modCount"?

转载 作者:行者123 更新时间:2023-11-29 07:29:31 24 4
gpt4 key购买 nike

在下面的代码中(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;
}

最佳答案

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

/** * The number of times this HashMap has been structurally modified * Structural modifications are those that change the number of mappings in * the HashMap or otherwise modify its internal structure (e.g., * rehash). This field is used to make iterators on Collection-views of * the HashMap fail-fast. (See 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++ 在上一行之后增加,但注意这里我们返回并看到注释 //existing mapping for key。因此,要回答您的问题,如果值被替换为现有键,则 modcount 不会增加,因为它既不会更改 hashmap 的结构,也不会导致 map 的重新散列。

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com