为什么在“HashMap类”中哈希函数中使用的数字如4,20,12,7

时间:2013-11-28 10:30:09

标签: java algorithm map hashmap

我正在阅读HashMap的{​​{1}}究竟是如何运作的。我在java类的hash方法中找到了代码{{1} }是HashMap的操作数之一。其他hashcode类似于Shift right zero fill operator operands 12 7。后来对结果进行了一些处理。我的问题是为什么只有这四个数字才能用于计算哈希函数中实际用于计算桶中位置的值

4

1 个答案:

答案 0 :(得分:3)

并非“只选择这四个数来计算散列函数中的值”,密钥对象的hashCode方法返回的哈希码是(非常重要的)输入。 HashMap实现中的此方法只是尝试改进此方法,因为有关HashMap之后如何使用该值的知识。

典型的实现只使用哈希码的低位,因为内部表的大小是2的幂。因此,改进应确保即使不同密钥的原始哈希码仅在高位中不同,低位中具有不同值的可能性也是相同的。

以示例Integer实例作为键:它们的哈希码与它们的值相同,因为这会将哈希码扩展到整个2³²int范围内。但是,如果您将值0xa00000000xb00000000xc00000000xd0000000放入地图中,则仅使用较低位的地图会产生较差的结果。这一改进解决了这一问题。

为此位操作选择的数字,以及算法通常是一个连续调查的领域。您将看到JVM实现之间的变化,因为开发永远不会停止。