跳到主要内容

String 的 hashCode 中的31

Java 8 中String类的hashCode()方法实现如下:

public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;

for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}

可以看到,循环中的每一步都对上一步的结果乘以一个系数31,那么,这个31又是怎么来的呢? 在 Effective Java 第二版的 Item 9: Always override hashCode when you override equals 中我们找到了答案:

The value 31 was chosen because it is an odd prime. If it were even and the multiplication overflowed, information would be lost, as multiplication by 2 is equivalent to shifting. The advantage of using a prime is less clear, but it is traditional. A nice property of 31 is that the multiplication can be replaced by a shift and a subtraction for better performance: 31 * i == (i << 5) - i. Modern VMs do this sort of optimization automatically.