HashMap系列文章(传送门):
二:源码级理解HashMap之resize()方法,带你一行行手撕
三:源码级理解HashMap之putVal()方法,一行行手撕源码
四:源码级理解HashMap之get()和remove()方法
- 首先为什么要扩容?
为了解决哈希冲突造成的链化严重,影响查询效率的问题,扩容会环节该问题
- 如何扩容:
走进源码
壹:一行行带你读源码
先读懂,后文会带你理清思路
final Node<K,V>[] resize() {
//引用扩容前的哈希表
Node<K,V>[] oldTab = table;
//表示扩容前table数组的长度
int oldCap = (oldTab == null) ? 0 : oldTab.length;
//表示扩容前的扩容阈值,触发本次扩容的阈值
int oldThr = threshold;
//newCap:扩容之后table的大小
//newThr:下一次扩容的阈值
int newCap, newThr = 0;
//如果oldCap>0,说明hashMap中的哈希表已经初始化了,这是一次正常的扩容
if (oldCap > 0) {
//如果扩容之前table数组的大小已经达到了最大阈值后,就不再扩容,返回老数组,并设置阈值为最大容量
if (oldCap >= MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return oldTab;
}
//左移一位实现阈值翻倍并赋给新阈值,如果新阈值小于最大容量并且,老阈值大于默认容量16,就把阈值翻倍
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
oldCap >= DEFAULT_INITIAL_CAPACITY)
newThr = oldThr << 1;