首页 >Java >java教程 >为什么Java在String的hashCode()中使用31作为乘数?

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

DDD
DDD原创
2024-12-19 17:07:10901浏览

Why Does Java Use 31 as the Multiplier in String's hashCode()?

深入探究 Java 的 String 的 hashCode() 31 乘数背后的推理

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn