我正在阅读HashMap
的{{1}}究竟是如何运作的。我在java
类的hash
方法中找到了代码{{1} }是HashMap
的操作数之一。其他hashcode
类似于Shift right zero fill operator
operands
12
7
。后来对结果进行了一些处理。我的问题是为什么只有这四个数字才能用于计算哈希函数中实际用于计算桶中位置的值
4
答案 0 :(得分:3)
并非“只选择这四个数来计算散列函数中的值”,密钥对象的hashCode
方法返回的哈希码是(非常重要的)输入。 HashMap
实现中的此方法只是尝试改进此方法,因为有关HashMap
之后如何使用该值的知识。
典型的实现只使用哈希码的低位,因为内部表的大小是2的幂。因此,改进应确保即使不同密钥的原始哈希码仅在高位中不同,低位中具有不同值的可能性也是相同的。
以示例Integer
实例作为键:它们的哈希码与它们的值相同,因为这会将哈希码扩展到整个2³²int范围内。但是,如果您将值0xa0000000
,0xb0000000
,0xc0000000
,0xd0000000
放入地图中,则仅使用较低位的地图会产生较差的结果。这一改进解决了这一问题。
为此位操作选择的数字,以及算法通常是一个连续调查的领域。您将看到JVM实现之间的变化,因为开发永远不会停止。