HashMap中的数据结构是数组+单链表的组合,我们希望的是元素存放的更均匀,最理想的效果是,Entry数组中每个位置都只有一个元素,这样,查询的时候效率最高,不需要遍历单链表,也不需要通过equals去比较K,而且空间利用率最大。那如何计算才会分布最均匀呢?我们首先想到的就是%运算,哈希值%容量=bucketIndex
源码中是怎么做的呢?
static int indexFor(int h,int length){
//这里的h为key调用hashCode方法计算出来的hash值,length为目前的容量
return h&(length-1);
}
当容量是2的幂次方时,h&(length-1)==h%length
那么初始容量为什么是16,以及加载因子为什么是0.75呢?
默认加载因子 (0.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本..在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地降低 rehash 操作次数。