0

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

阅读“如果两个不同的对象具有相同的哈希码会发生什么”

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

哪个集合在列表中维护重复项,如果是,如何使用 get("key") 方法识别相关对象?

4

4 回答 4

2

“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

于 2013-01-17T10:04:31.580 回答
1

以下是哈希图(通常)的工作方式:

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

仅仅因为两个项目存储在同一个桶(链表)中并不意味着它们具有相同的键。这只是意味着它们的键碰巧散列到相同的值(或等效值以散列桶的数量为模,准确地说)。

于 2013-01-17T10:06:28.040 回答
0

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

您可能可以在这里找到解决问题的方法:HashMap with multiple values under the same key

于 2013-01-17T10:08:47.670 回答
0

在此处输入图像描述

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

但是如果对象 A2 和 A3 具有相同的哈希码并返回trueequals()则对象 A2 将被 A3 替换。

于 2013-01-17T10:20:29.020 回答