在 HashMap 中有两个比较重要的参数; Capacity 和 Load Factor ,其中 Capacity 决定了存储容量的大小,默认为 1 6 ,而 Load Factor 决定了填充比例 , 一般使用默认的 0.75 。基于这两个参数的乘积, HashMap 内部用 threshold 变量表示 HashMap 中能放入的元素个数。
HashMap 容量并不会在 new 的时候分配,而是在第 一次 put 的时候完成创建的,源码如下:
public V put (K key , V value) {if (table == EMPTY TABLE) { inflateTable(threshold) ;....}
//第一次put时,初始化tableprivate void inflateTable(int toSize){//找到大于参数值且最接近2的幂值,假如输入参数是27,则返回32int capacity= roundUpToPowerOf2(toSize) ;// threshold在不超过限制最大值的前提上等于capacity*loadFactorthreshold= (int) Math.min(capacity * loadFactor,MAXIMUM CAPACITY+ 1)table= new Entry[capacity];initHashSeedAsNeeded(capacity)} ;


比如16,运算流程如下:
最后得到了只有最高位是1,后面全是0的,2的n次幂数字了;
