这一步的扩容阈值不应该是数组长度*加载因子吗?为什么非得当前数组长度<default_inital_capacity时扩容阈值才等于长度*加载因子呢

解决方案 »

  1.   

    看这个图有些细节是看不懂的,建议看源码,这部分的源码我给你贴这儿了,这是jdk1.8的扩容逻辑
    int oldCap = (oldTab == null) ? 0 : oldTab.length;
            int oldThr = threshold;
            int newCap, newThr = 0;
            if (oldCap > 0) {
                if (oldCap >= MAXIMUM_CAPACITY) {
                    threshold = Integer.MAX_VALUE;
                    return oldTab;
                }
                else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
                         oldCap >= DEFAULT_INITIAL_CAPACITY)
                    newThr = oldThr << 1; // double threshold
            }
            else if (oldThr > 0) // initial capacity was placed in threshold
                newCap = oldThr;
            else {               // zero initial threshold signifies using defaults
                newCap = DEFAULT_INITIAL_CAPACITY;
                newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
            }
            if (newThr == 0) {
                float ft = (float)newCap * loadFactor;
                newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?
                          (int)ft : Integer.MAX_VALUE);
            }
            threshold = newThr;
      

  2.   

    你这文档看着应该就是jdk1.8的hashMap,但是好像有点问题,看源码是如果你重载了负载因子和底层初始化数组长度,数组扩容时,按你说的情况会走到图中圈起来的部分,新数组的扩容阈值会等于当前数组长度*2*负载因子