【问题标题】:How java HashMap works internally? [duplicate]java HashMap 如何在内部工作? [复制]
【发布时间】:2020-06-21 05:45:39
【问题描述】:

我在this 页面上看到以下段落:

在 Java 8 之前,HashMap 和 Java 中所有其他基于哈希表的 Map 实现类通过链接来处理冲突,即它们使用链表来存储由于冲突而在同一个桶中结束的映射条目。如果键最终位于已存储条目的相同存储桶位置,则该条目仅添加到那里的链表的头部。在最坏的情况下,这会将 HashMap 的 get() 方法的性能从 O(1) 降低到 O(n)。为了在 HashMap 冲突频繁的情况下解决这个问题,Java8 已经开始使用平衡树而不是链表来存储冲突条目。这也意味着在最坏的情况下,您将获得从 O(n) 到 O(log n) 的性能提升。

这听起来很有趣,但是我猜这个信息的来源是什么?我知道 Oracle 官方教程可以在 here 找到。但我不认为他们走得那么深。即使HashMap api docs 也没有解释相同的内容。您能否向我指出任何官方的 Oracle 文档/教程来解释这个和这样的深入事实?或者这些信息的来源是开源代码?

【问题讨论】:

  • "或者这个信息的来源是开源代码?"确实是
  • 如果您好奇,hereHashMap 的 Java 8 源代码。
  • "即使是 HashMap api 文档也没有解释相同" 那是因为它是一个实现细节。如果你关心实现细节,源代码就是源代码。

标签: java hashmap


【解决方案1】:

HashMap 的工作原理是散列,我们有 put(key, value) 和 get(key) 方法用于从 HashMap 中存储和检索对象。当我们将 Key 和 Value 对象传递给 Java HashMap 上的 put() 方法时,HashMap 实现会调用 Key 对象上的 hashCode 方法,并将返回的 hashcode 应用到自己的哈希函数中以找到存储 Entry 对象的桶位置,重要的一点是 HashMap在 Java 中,键和值对象都作为 Map.Entry 存储在桶中,这对于理解检索逻辑至关重要。

【讨论】:

    猜你喜欢
    • 2014-09-29
    • 2016-12-12
    • 2015-08-22
    • 1970-01-01
    • 2011-05-07
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    相关资源
    最近更新 更多