根据Java文档,String对象的hash code计算为:

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

使用int算术,其中s[i]

为什么使用31作为乘数?

我知道乘数应该是一个相对较大的质数.那么,为什么不是29,或者37,甚至97呢?

推荐答案

According to Joshua Bloch's Effective Java (a book that can't be recommended enough, and which I bought thanks to continual mentions on stackoverflow):

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

(from Chapter 3, Item 9: Always override hashcode when you override equals, page 48)

Java相关问答推荐

有没有方法可以修复错误错误:无法初始化主类code_editor?

通过推送通知向自己发送Matrix消息

如何从片段请求数据到活动?在主要活动中单击按钮请求数据?

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

取消按钮,但没有任何操作方法引发和异常

调用引发泛型异常的泛型方法时出现编译错误

内存中的H2修剪尾随空格

蒙蒂霍尔比赛结果不正确

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

根本不显示JavaFX阿拉伯字母

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

如何生成指定范围内的11位序列号?

持续时间--为什么在秒为负数的情况下还要做额外的工作?

如何在Java中的重写方法参数中强制(Enum)接口实现?

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

Java中的一个错误';s stdlib SocksSocketImpl?

始终使用Spring Boot连接mongodb上的测试数据库

Spring Integration SFTP 连接失败 - 无法协商 kex 算法的密钥交换