为什么 String hashCode 方法选择数字 31 作为乘子

647 阅读1分钟
原因有两点:

1.首先31是一个不大不小的质数,是作为hashCode乘子的优选质数之一,在解决hash碰撞上代价相对最小效果相对最好。

2.该数字31可以被jvm优化 31 * i = (i << 5) - i


引用:

选择数字31是因为它是一个奇质数,如果选择一个偶数会在乘法运算中产生溢出,导致数值信息丢失,因为乘二相当于移位运算。选择质数的优势并不是特别的明显,但这是一个传统。同时,数字31有一个很好的特性,即乘法运算可以被移位和减法运算取代,来获取更好的性能:31 * i == (i << 5) - i,现代的 Java 虚拟机可以自动的完成这个优化。


参考:

www.iocoder.cn/Fight/Why-d…