【问题标题】:Is my understanding of HashMap correct?我对 HashMap 的理解正确吗?
【发布时间】:2015-09-25 06:46:19
【问题描述】:

HashMap 使用用户提交的密钥生成一个 hashCode。以下可能是两种情况:

1) 如果两个键(Object)相同:

例如

hashmap.put(1,"one");
hashmap.put(1,"another one");

现在,最初会插入“一个”,然后会被“另一个”覆盖。

2) 如果两个不同对象的 hashCode 相同: 例如,如果我有一个 5 号的桶,我尝试:

hashmap.put(5,"this is five");
hashmap.put(25,"this is twenty five");

由于 hash % (SIZE-1) 将指向相同的位置,因此将创建 LinkedList 以将值存储为: "this is twenty five" -> "this is five"

如有错误请指正

【问题讨论】:

  • 你几乎是对的。但是,Java 不一定使用链表来存储相同存储桶中的值。如果桶中有足够的值,它将使用红黑树(一种二叉搜索树)而不是列表。这是 Java 8 的一个新特性,在某些情况下可以加快速度。除了那个细节,你的基本理解是正确的。
  • 从功能的角度来看,你可以忽略HashMap,只使用为Map指定的合约。只有在处理诸如性能之类的非功能方面时,实现是 HashMap 才会变得有趣。

标签: java hashmap


【解决方案1】:

您的第一个问题是关于Map 的一般问题。当您使用相同的密钥调用.put()Map 的行为是Map 公共合同记录 部分。无论具体的实现如何,任何(合理的)Map 实现都必须以这种方式运行。

您的第二个问题是关于HashMap实现HashMap 如何解决冲突不是其合同的一部分(尽管文档确实描述了行为),因此可以(并且确实)在版本之间进行更改。并非所有 Map 实现都依赖于 .hashCode(),并且此类实现无需解决此类冲突。

概念上的区别在于“正确性”和“效率”之间。因为冲突解决行为不是合同的记录部分,它可能会随着时间而改变。在 Java 8 HashMap 使用链表结构之前(不要与 java.util.LinkedList 混淆),从 Java 8 开始,它们有时会使用红黑树结构(不要与 java.util.TreeMap 混淆)以提高效率.

您可能还对my answer to this question 感兴趣,它探讨了对象的哈希码和相等性之间的关系。

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多