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;
}
解释:
在String类中有个私有实例字段hash表示该串的哈希值,在第一次调用hashCode方法时,字符串的哈希值被计算并且赋值给hash字段,之后再调用hashCode方法便可以直接取hash字段返回。
String类中的hashCode计算方法还是比较简单的,就是以31为权,每一位为字符的ASCII值进行运算,用自然溢出来等效取模。
哈希计算公式可以计为s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]
关于为什么取31为权?
原因一:主要是因为31是一个奇质数,所以31 * I = 32 * II =(I << 5)-i,这种位移与减法结合的计算相比一般的运算快很多。
原因二:值31被选择,因为它是一个奇数的素数如果它是偶数,并且倍增溢出,则信息将会丢失,因为乘以2移位相当于使用素数的好处不太清楚,但是是传统的.31的一个很好的特性是乘法可以被一个移位和一个减法取代以获得更好的性能:31 * i ==(i << 5) - i。现代虚拟机自动进行这种优化。