【问题标题】:Does HashMap.get() examine more than one hash bucketHashMap.get() 是否检查多个哈希桶
【发布时间】:2016-03-10 12:40:51
【问题描述】:

例如,对于所有自定义对象= 2(in bits =..10),我们的哈希值都很差。相关帖子中的某处说:“HashMap 使用两个大小的幂,因为您可以通过 hashCode 和 MASK 轻松选择存储桶,其中 MASK = 000....111 其中 1s 的数量 == 当前 2 的幂用于大小。”

因此,对于 map 长度 = 2,我们有 ..10 & 01 = 0 - 大小为 2 时存储桶的索引。 对于 size = 4,我们将有:..010 & 11 = 10(= 2dex) - 4 号的索引。 对于尺寸 = 8,我们将有:..010 & 111 = 10(= 2dex) - 再次用于尺寸 8。 因此,在这种简单的情况下,我们将有 2 个不同的桶用于相同的对象键。(通常,映射方法 hash(int hashCode) 的作用相同 - 它可以为相同的对象哈希生成不同的桶索引 - 取决于映射大小 - 以处理冲突在低位)。当您在地图上执行 get() 时 - 它是否会通过所有适合相同密钥的不同存储桶 - 或不?或者如何跟踪对象哈希所需的所有存储桶?
Why hash method in HashMap

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    每当调整 HashMap 的大小时,所有条目都会重新散列,即,如果地图的新大小需要,它们会被移动到新的存储桶中。

    因此get()只需要寻找与搜索到的key的hashCode()和map的当前大小相匹配的bucket即可。

    它是否会遍历所有适合同一密钥的不同存储桶?

    在任何给定时间点,给定密钥只有一个合适的存储桶(这取决于密钥的hashCode()HashMap 的当前大小)。

    【讨论】:

    • 那么方法 int hash(key.hashCode) 的意义又是什么?我认为它可以为同一个密钥创建多个存储桶(从而通过将高位移到低位来执行更好的分配)。但是,如果它产生的桶数量与之前相同(1 个密钥进入 1 个桶)——它有什么用?
    • 我想了 1 次,并想象了我们有哈希 326 和 120 且大小为 16 的情况。如果是二次幂 hashMap,这些密钥将放在同一个桶中。因此方法 hash 将这些哈希移动到低位 - 在某些大小上,它们将应用于掩码中的 111 - 并到达不同的桶,从而改善对象的分布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2017-04-28
    • 2011-05-19
    • 2017-04-13
    • 2013-11-22
    • 2013-07-06
    • 1970-01-01
    相关资源
    最近更新 更多