根据 Java 文档,对象的哈希码String计算为:
String
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 使用int算术运算,其中s[i]是字符串的第 i 个字符,是字符串n的长度,^表示取幂。
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用int算术运算,其中s[i]是字符串的第 i 个字符,是字符串n的长度,^表示取幂。
int
s[i]
n
^
为什么用 31 作为乘数?
我知道乘数应该是一个相对较大的素数。那么为什么不是 29、37 甚至 97 呢?
选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以 2 相当于移位。使用素数的优势不太明显,但它是传统的。31 的一个很好的特性是乘法可以用移位和减法代替,以获得更好的性能:31 * i == (i << 5) - i. 现代虚拟机自动进行这种优化。
31 * i == (i << 5) - i
(来自第 3 章第 9 项:覆盖等于时始终覆盖哈希码,第 48 页)