String的hashCode
源码
public int hashCode() {
// 起到缓存的效果, 防止反复计算 hashCode
int h = hash;
// 如果 h != 0, 说明已经计算过 hashCode 了, 直接返回缓存值即可
if (h == 0 && value.length > 0) {
char val[] = value;
// 计算的核心步骤是这个 for 循环
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
计算逻辑
逻辑: 31 * h(h为临时变量) + 字符的ASCII码, 多字符则向下递归
例如 “ab” 的 hashCode 为
hashCode = 31 * 97 + 98;// 'a' 对应的整数是 97, 'b' 对应的整数是 98
初衷: 如果想测试HashMap的hash冲突
知道他的计算逻辑,查阅ASCII,例如"Aa" 和 “BB”的hashcode就相同
我们可以从长度为 2 的 String 入手。
如果字符串 s 长度为 2,则它的 hashCode 为:
hashCode = s[0] * 31 + s[1]
如果 s[0]=‘A’,则
hashCode = 97 * 31 + s[1]
如果 s[0]=‘B’,则
hashCode = (97 + 1) * 31 + s[1]
// 也就是
hashCode = 97 * 31 + s[1] + 31
这样不就看出来Aa 和BB一样了么
最后附ASCII链接 ASCII对照表