hashMap源码 原理 操作 设计
散列函数
hashCode是key自身产生的,HashMap仅对其进行二次加工;
二次加工包括 h = h^(h>>>16) 以及 index = h&(size - 1)
这里 注意 hashMap的hash表大小是从2的幂开始,每次扩容都乘以2,故size始终是2的幂。故h&(size-1)其实就是 h%size;
hashCode()
String的hashCode在第一次被调用后将被缓存起来。可以容易的看出,String的hashCode就是一个 31的多项式 长度为3的字符串最终结果形如 31^2 * v[2]+ 31 * v[1] + v[0]
/** Cache the hash code for the string */ private int hash; // Default to 0
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; }
switch case 操作符
switch对非整形的支持也是依靠其hashCode将非整形转为整形才能做到