HashMap原理剖析(jdk8)
HashMap基本结构
根据key的hashCode在进行散列哈希,尽可能的减少hash冲突的产生
散列哈希的算法是把key的hashcode逻辑右移(前补0)16位,然后在与原来的hashcode进行按位异或运算得到新的hash值
如果原来的hashcode小于2的16次方也就是65536这个算法是不起作用的,考虑可以用md5或者二次哈希进行散列但是这种右移16位再进行按位异或的代价是最小的,所以采用的是这个
HashMap表格大小计算
hashmap的数组的容量都是2的次方幂
通过这个方法tableSizeFor()使得传进的参数都是变未大于等于参数的最小的一个2的次方幂的数
int n = cap - 1 的原因是如果传入的已经是2的次方幂就不能再次给他再乘以一个2的 (都必须满足返回的数是大于等于参数的最小的一个2的次方幂的数)最后经过一系列运算都是返回 …1111+1