Java 使用重复键映射行为

Java 使用重复键映射行为,java,collections,Java,Collections,HashMap通常用最新的值替换它。但我读到的一篇文章提到了它,因为如果添加重复值,它会保留一个链接列表 但我没有发现连ConcurrentHashMap都没有维护这样的列表 什么集合在列表中维护重复项?如果是,如何使用get(“key”)方法识别相关对象?该“列表”实际上是链表对象结构的重新实现。这是HashMap用来存储键和值的入口类: static class Entry<K,V> implements Map.Entry<K,V> { final K k

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

但我没有发现连ConcurrentHashMap都没有维护这样的列表

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

该“列表”实际上是链表对象结构的重新实现。这是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
..
}
静态类条目实现Map.Entry{
最终K键;
V值;
Entry next;列表实际上是链表对象结构的重新实现。这是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
..
}
静态类条目实现Map.Entry{
最终K键;
V值;
下一个条目;以下是哈希映射(通常)的工作方式:

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

仅仅因为两个项存储在同一个存储桶(链表)中并不意味着它们具有相同的键。这只是意味着它们的键恰好散列到相同的值(或者精确地说,等于散列存储桶数的模值)。

以下是散列映射(通常)的工作原理:

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

仅仅因为两个项存储在同一个bucket(链表)中并不意味着它们具有相同的键。这只是意味着它们的键恰好散列到相同的值(或者精确地说,等于散列bucket数的模化值)。

在ConcurrentHashMap中,HashMap指的是线程安全,与为一个键存储多个值无关

您可能可以在这里找到问题的解决方案:

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

您可能可以在此处找到问题的解决方案:

如您所见,这里的数组是hashcode,如果两个对象A2和B2具有相同的hashcode,那么它们将被添加到同一个bucket中

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

如您所见,这里的数组是hashcode,如果两个对象A2和B2具有相同的hashcode,那么它们将被添加到同一个bucket中


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

重复值!=相同的hashcode您是在询问如何为一个键存储多个值,还是如何在基于哈希的映射中解决哈希冲突?是的,哈希映射不支持这一点,对吗?在
HashMap
中,
元素被分成称为bucket的组(例如,最初是16个bucket)。同一bucket中的元素在其哈希代码中有一些共同点(简化,但假设最后4位是相同的)。因此,您可以看到同一个bucket中可能存在多个键。如果要查找值,请根据键的hashcode选择bucket,然后遍历元素。当两个键具有相同的hashcode时,则
equals()
被调用以检查精确匹配。如果不匹配,将存储两个不同的条目,否则将覆盖该值。因此,具有多个对象的bucket将其存储为链接列表,对吗?重复值!=相同的HashCode您是在问如何为一个键存储多个值,还是如何在哈希b中解决哈希冲突ased map?是的,哈希映射中不支持它,对吗?在
HashMap
中,
key
元素被分成称为bucket的组(例如,最初16个bucket)。同一bucket中的元素在其哈希代码中有一些共同点(简化,但假设最后4位相同)。因此,您可以看到同一个bucket中可能存在多个键。如果要查找值,请根据键的hashcode选择bucket,然后遍历元素。当两个键具有相同的hashcode时,则
equals()
被调用以检查精确匹配。如果不匹配,将存储两个不同的条目,否则将覆盖该值。因此,具有多个对象的bucket会将其存储为链表,对吗?