java - Map内部如何输入重复的key?

标签 java collections

我很困惑,本地图遇到重复的键时 - 它进入同一个存储桶,所以它检查相同的键并替换为新值。

当插入具有相同存储桶的不同 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/

相关文章:

java - 停止并从 ScheduledExecutorService 中删除任务

java - 在 Tomcat 中部署后来自 servlet 过滤器的 JSP 文件路径

collections - Clojure:cons (seq) 与 conj (list)

c# - 附加一个集合对象

java - 在两个列表之间执行 'contains' 的有效方法

java - 在 java 帮助中格式化输出

java - 如何重命名结果程序集以安装在 .m2 中

java - 在 URL 中向用户显示键值是否存在任何安全问题?

java - Java 中是否存在有界非阻塞 Collection?

java - 枚举映射和流