使用重复键映射行为

时间:2013-01-17 09:56:21

标签: java collections

HashMap通常用最新的值替换它。但我读过的一篇文章提到它,因为如果重复的值增加,它会保留一个链表。

Read the "What will happen if two different objects have same hashcode"

但是我甚至没有发现ConcurrentHashMap没有维护这样的列表?

什么集合在列表中保留重复项,如果是,如何使用get(“key”)方法识别相关对象?

4 个答案:

答案 0 :(得分:2)

“List”实际上是链表对象结构的重新实现。这是Entry类,HashMap用于存储键和值的内容:

static class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;  <-- This one refers to the next element
    int hash
..
}

因此,LinkedList没有明确的实现。

文章讨论了两个密钥具有相同哈希码会发生什么。然后它会存储两个键值对,当然。如果两个键彼此相距equal(),那么它将替换该值。

HashMap的工作原理:请参阅我对此问题的回答:Best practices on what should be key in a hashtable

答案 1 :(得分:1)

以下是hashmaps(通常)的工作原理:

Hashmaps保留了一系列用于放置东西的桶。插入内容时,哈希函数将应用于您要插入的键。生成的“哈希”指示将数据放入哪个存储桶。两个不同的密钥可以散列到同一个存储桶。这意味着当您将第二个哈希值插入到存储桶10时,java实现必须将新项目添加到链接列表的末尾,以跟踪存储桶10中的项目。

仅仅因为两个项目存储在同一个存储桶(链表)中并不意味着它们具有相同的密钥。它只是意味着它们的键恰好散列到相同的值(或者等价的值以模拟散列桶的数量为准)。

答案 2 :(得分:0)

ConcurrentHashMap中的“concurrent”是指线程安全性,与存储一个键的多个值无关。

您可以在此处找到问题的解决方案:HashMap with multiple values under the same key

答案 3 :(得分:0)

enter image description here

在这里您可以看到数组是哈希码,如果两个对象A2和B2具有相同的哈希码,那么它们将被添加到同一个桶中。

但是如果对象A2和A3具有相同的哈希码并在true上返回equals(),那么对象A2将被替换为A3。