小编典典

为什么 Java 的 String 中的 hashCode() 使用 31 作为乘数?

all

根据 Java
文档,对象的哈希码String计算为:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

使用int算术运算,其中s[i]是字符串的第 i 个字符,是字符串n的长度,^表示取幂。

为什么用 31 作为乘数?

我知道乘数应该是一个相对较大的素数。那么为什么不是 29、37 甚至 97 呢?


阅读 93

收藏
2022-03-10

共1个答案

小编典典

选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以 2 相当于移位。使用素数的优势不太明显,但它是传统的。31
的一个很好的特性是乘法可以用移位和减法代替,以获得更好的性能:31 * i == (i << 5) - i. 现代虚拟机自动进行这种优化。

(来自第 3 章第 9 项:覆盖等于时始终覆盖哈希码,第 48 页)

2022-03-10