在 HashMap 中有两个比较重要的参数; Capacity 和 Load Factor ,其中 Capacity 决定了存储容量的大小,默认为 1 6 ,而 Load Factor 决定了填充比例 , 一般使用默认的 0.75 。基于这两个参数的乘积, HashMap 内部用 threshold 变量表示 HashMap 中能放入的元素个数。
    HashMap 容量并不会在 new 的时候分配,而是在第 一次 put 的时候完成创建的,源码如下:

    1. public V put (K key , V value) {
    2. if (table == EMPTY TABLE) { inflateTable(threshold) ;
    3. ....
    4. }
    1. //第一次put时,初始化table
    2. private void inflateTable(int toSize){
    3. //找到大于参数值且最接近2的幂值,假如输入参数是27,则返回32
    4. int capacity= roundUpToPowerOf2(toSize) ;
    5. // threshold在不超过限制最大值的前提上等于capacity*loadFactor
    6. threshold= (int) Math.min(capacity * loadFactor,MAXIMUM CAPACITY+ 1)
    7. table= new Entry[capacity];
    8. initHashSeedAsNeeded(capacity)
    9. } ;

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