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 冲突后存储在链表或红黑树的元素)达到扩容阈值时就开始扩容了。
分类:
标签:
,
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步