处理Hashmap中的键冲突

时间:2013-11-20 18:21:56

标签: java collections hashtable

我为Hashmap的put(K key, V value)找到的code。如果发生碰撞,此方法将替换该值,但不会将Entry添加到存储桶的LinkedList。
我在这里缺少什么?

3 个答案:

答案 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>