HashMap初始容量为什么是2的幂次方?
HashMap中的数据结构是数组+单链表的组合,我们希望元素存放的更均匀,最理想的效果是Entry数组中每个位置都只有一个元素,这样,查询的时候效率最高,不需要遍历单链表,也不需要通过equals去比较Key,而且空间利用率最大。那么如何计算才会分布最均匀呢?我们首先想到的就是%运算,哈希值%容量=bucketIndex,我们来看源码
static int indexFor(int h,int length){
return h & (length - 1);
}
h是通过k的hashCode最终计算出来的哈希值,并不是hashCode本身,而是hashCode之上又经过一层运算的hash值,length是目前容量。当容量是2^n时,h & (length -1) == h % length。
这个等式实际上可以推理出来,2^n转换成二进制就是1+n个0,减1之后就是0+n个1,如16 -> 10000,15 -> 01111,那根据&位运算的规则,都为1(真)时,才为1,那0≤15运算后的结果≤15,假设h <= 15,那么运算后的结果就是h本身,h >15,运算后的结果就是最后三位二进制做&运算后的值,最终,就是%运算后的余数。