我很困惑,本地图遇到重复的键时 - 它进入同一个存储桶,所以它检查相同的键并替换为新值。
当插入具有相同存储桶的不同 key 时会发生什么。
它是否检查 key 以及将 key 存储在哪里?
最佳答案
我假设您正在谈论HashMap
。让我们看看source :
386 public V put(K key, V value) {
387 if (key == null)
388 return putForNullKey(value);
389 int hash = hash(key.hashCode());
390 int i = indexFor(hash, table.length);
391 for (Entry<K,V> e = table[i]; e != null; e = e.next) {
392 Object k;
393 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
394 V oldValue = e.value;
395 e.value = value;
396 e.recordAccess(this);
397 return oldValue;
398 }
399 }
400
401 modCount++;
402 addEntry(hash, key, value, i);
403 return null;
404 }
所以这里发生的是 put()
方法对 key 进行哈希处理并访问相应的存储桶。然后,它循环遍历其中包含的条目1,如果找到其键等于
给定键的条目,则会用给定值替换该条目的值,即:
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;
<小时/>
1 Entry
是包含键值对的类。
关于java - Map内部如何输入重复的key?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22001509/