HashMap番外(二):何时扩容呢?

本文基于 JDK1.8


我们都知道 HashMap 内部有个属性负载因子用来扩容,那么什么时候才会扩容呢?
源码中还有一个属性 threshold 👇

    /**
     * The next size value at which to resize (capacity * load factor).
     */
    int threshold;

翻译一下:需要去 resize 时的下一个值(容量 * 负载因子

我们知道了如何计算这个阈值,那么在哪里使用这个阈值并扩容呢?我们再探源码👇

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
	... ....
        if (++size > threshold)
            resize();
	... ...
    }

此方法的源码解读,请参考笔者的另一篇文章浅谈 HashMap(二):put 插入方法源码分析
从源码可知,在插入一个新元素时,实际容量 size 加一,然后判断元素数是否大于扩容阈值,如果是则进行扩容。这个是什么意思呢?就是并不是说当 HashMap 中的 table(不明确这个属性的可以参考笔者另一篇文章浅谈 HashMap(一):数据结构底层实现方式)数组占用了 3/4 时才扩容,而是实际容量(数组中的元素 + hash 冲突后存储在链表或红黑树的元素)达到扩容阈值时就开始扩容了

posted @ 2021-08-09 15:09  超级鲨鱼辣椒  阅读(281)  评论(0编辑  收藏  举报