首先下面是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,因为选31可以降低两个字符串的哈希碰撞概率)。
下面是注释版:
public int hashCode() {
//获取上一次计算的hash值
int h = hash;
//如果是0说明哈希值还没算过,否则说明已经算过了,就不需要重复算了
if (h == 0 && value.length > 0) {
//value就是字符数组,表示当前字符串里的各个字符
char val[] = value;
for (int i = 0; i < value.length; i++) {
//加权相加
h = 31 * h + val[i];
}
hash = h;
}
return h;
}