我为Hashmap的put(K key, V value)
找到的code。如果发生碰撞,此方法将替换该值,但不会将Entry
添加到存储桶的LinkedList。
我在这里缺少什么?
答案 0 :(得分:2)
你不会错过任何一件事。 Java Map
的一般合同是每个键只有一个值。
如果您想为每个键保留多个值,则必须使用Apache Commons' MultiMap之类的内容,或者通过Map<K, List<V>>
自行实现类似的内容。
答案 1 :(得分:2)
你为什么这么想?相关部分如下:
计算内部表中的索引:
390 int i = indexFor(hash, table.length);
遍历table[i]
处的链接列表并搜索密钥是否已包含在内:
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))) {
密钥已包含=&gt;替换价值......
394 V oldValue = e.value;
395 e.value = value;
396 e.recordAccess(this);
...并返回旧值
397 return oldValue;
398 }
否则继续循环
399 }
我们在链接列表的末尾,我们还没有找到密钥,因此它尚未包含。所以让我们添加一个新条目:
402 addEntry(hash, key, value, i);
答案 2 :(得分:0)
在HashMap
中,您不能多次使用相同的密钥。这就是为什么值被替换而不仅仅是创建一个新的Map.Entry<K,V>