HashMap 通常用最新的值替换它的值。但是我读过的一篇文章提到了它,因为如果添加重复值,它会保留一个链表。
但是我什至没有发现 ConcurrentHashMap 没有维护这样的列表?
哪个集合在列表中维护重复项,如果是,如何使用 get("key") 方法识别相关对象?
HashMap 通常用最新的值替换它的值。但是我读过的一篇文章提到了它,因为如果添加重复值,它会保留一个链表。
但是我什至没有发现 ConcurrentHashMap 没有维护这样的列表?
哪个集合在列表中维护重复项,如果是,如何使用 get("key") 方法识别相关对象?
“List”实际上是对链表对象结构的重新实现。这是 HashMap 用来存储键和值的 Entry 类:
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 practice on what should be key in a hashtable
以下是哈希图(通常)的工作方式:
Hashmaps 保存了一个桶的集合,用来放置东西。当您插入某些内容时,哈希函数将应用于您要插入的键。生成的“哈希”指示将数据放入哪个存储桶。两个不同的键可以散列到同一个存储桶。这意味着,例如,当您将散列到存储桶 10 的第二个项目插入时,java 实现必须将您的新项目添加到跟踪存储桶 10 中项目的链表的末尾。
仅仅因为两个项目存储在同一个桶(链表)中并不意味着它们具有相同的键。这只是意味着它们的键碰巧散列到相同的值(或等效值以散列桶的数量为模,准确地说)。
ConcurrentHashMap 中的“并发”是指线程安全,与为一个键存储多个值无关。
您可能可以在这里找到解决问题的方法:HashMap with multiple values under the same key
在这里,您可以看到数组是哈希码,如果两个对象 A2 和 B2 具有相同的哈希码,那么它们将被添加到同一个桶中。
但是如果对象 A2 和 A3 具有相同的哈希码并返回true
,equals()
则对象 A2 将被 A3 替换。