在下面的代码(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/