Java 的 String 实现采用特定的公式来计算哈希码:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
其中 s[i] 表示字符串的第 i 个字符,n 表示其长度,^ 表示求幂。然而,一个相关的问题出现了:为什么乘数设置为 31?
这个选择源于 Joshua Bloch 的著名著作《Effective Java,第二版》中概述的原则。 Bloch 的基本原理围绕乘数的两个关键标准:它应该是一个相对较大的素数。
奇数素数乘数的好处
Bloch 强调使用像31这样的奇素数乘法器可以确保乘法运算不会因溢出而导致信息丢失。如果乘数是偶数,则可能会发生溢出,并且由于乘以 2 类似于移位,因此关键信息可能会受到损害。
素数乘数的微妙优势
虽然选择质数乘数的具体优势不太明显,但它符合惯例。值得注意的是,31 拥有一个独特的属性:它允许将乘法有效地替换为移位和减法,从而提高性能。这种优化通常由现代虚拟机 (VM) 自动执行。
共识
综上所述,Java 使用 31 作为 String 的 hashCode() 方法的乘数源于它作为奇素数的地位。这种选择可以防止由于溢出而丢失信息,并通过用移位和减法代替乘法来增强性能。
以上是为什么Java在String的hashCode()中使用31作为乘数?的详细内容。更多信息请关注PHP中文网其他相关文章!