原因有两点:
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…