Java中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.
归纳如下:
- 奇数,乘法运算溢出时不丢失信息
- 质数,传统做法
- 可优化 31 * i == (i << 5) - i
网友评论