【问题标题】:What is meant by number of buckets in the HashMap?HashMap 中的桶数是什么意思?
【发布时间】:2013-09-09 07:15:45
【问题描述】:

我正在阅读 Hashmap。

HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数。

如果Hashmap中有10个键值对。假设 Hashcode 不同。

每个将驻留在一个桶中,对吗? 或者一个bucket可以有bucket多个key-value对?

因为bucket在英文中的意思是一个可以容纳许多对象的大东西。

【问题讨论】:

标签: java collections hashmap


【解决方案1】:

是的,没错,每个桶可以有多个键值对。

对象的hashCode() 确定它进入哪个桶,通过以下表达式:object.hashCode() % n,其中 n = 桶的总数,% 是模运算符。

大多数情况下,对象会很好地分布在存储桶中,但您无法保证它们的去向。这取决于数据和 hashCode 函数。

很明显,当hashCode实现不佳时,hashmap的性能会下降。

还阅读了相关的 equals / hashcode 合约。

【讨论】:

  • 你的意思是,桶可以有多个键值对,它们具有不同的哈希码。
  • @Thinker 我会说存储桶是哈希码。并且所有具有相同哈希码的对象都落入该桶中
  • @PrasadKharkar hashCode() 可以大于存储桶的数量。模运算符通常从 hashCode 中分配桶。
  • @vikingsteve,这是新的学习。我讲述了我从 Kathie Sierra SCJP 书中学到的东西。你能详细说明一个好的链接吗?会很棒的。
  • “对象的 hashCode() 确定它进入哪个存储桶”——这有点误导。正如您在下一句中指出的那样,hashCode() 返回“哈希码”而不是存储桶编号/索引。模运算符是给桶的东西。哈希码不是一个桶,桶不是一个哈希码。哈希码是哈希码,对象的 hashCode() 实现(%)外部的一些代码决定了存储桶(它的索引)。答案是正确的。造成混淆的原因只是术语上的轻微错误。
【解决方案2】:

在 java 中,如果你在 HashMap 中存储一个对象,首先 HashMap 实现调用 hashCode() 方法来查找存储桶位置。然后它将两者存储:键和值作为条目。注意!它还存储密钥,因为它在检索对象期间至关重要。两个对象可以具有相同的哈希码,因此如果发生这种情况,则 HashMap 将使用相同的存储桶位置并将第二个对象也存储在那里。在里面它为此使用了一个 LinkedList。 (不是java.util.LinkedList,而是更简单的实现)

在检索期间:您有一个键 -> hashCode() -> 存储桶位置 -> 通过键在 LinkedList 中搜索 -> 返回对象。

编辑: 因此,您在同一位置有一个存储桶,但存储桶是 LinkedList,因此它可以存储多个条目。所以桶的数量就是Hashmap的容量,描述了你可以存储多少Entries而不用把它们链接在一个列表中。

你可以在这里找到一篇很棒的文章和更详细的解释: http://javahungry.blogspot.com/2013/08/hashing-how-hash-map-works-in-java-or.html http://javarevisited.blogspot.com/2011/02/how-hashmap-works-in-java.html

【讨论】:

  • 旧评论,但你写的概念是错误的,除了第一段。
【解决方案3】:
Bucket with hashcode 1    Bucket with hashcode 2 and similar
  K and V                    K and V
  K and V                    K and V 

因此,密钥的hashCode() 决定了 K V 对在哪个桶中,并且相同的hashCode 用于在查找时找到 K V 对。

hashCode() 永远不应返回 常量 值。因为这意味着所有对象都将位于一个存储桶中。这与首先​​不使用Map 相同。由于所有键值对都在同一个桶中,Java 必须遍历所有对象才能找到键。

【讨论】:

    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多