扩容机制
触发条件:HashMap 的默认容量为 16 ,负载因子为 0.75,当集合中的元素超过容量与负载因子的乘积时,会引发扩容机制。
- 判断旧容量是否已经最大值,是的话不再扩容
不是:
- 先初始化一个原来两倍的数组。
- 判断旧数组中的元素是数组还是链表还是红黑树
- 如果桶中只有一个节点,直接计算这个节点在新数组中的位置并放置
- 如果桶中结构是红黑树,则进行树分割处理
如果红黑树的值小于 6 ,就会退化成链表。
- 如果是链表,将链表一分为二,通过e.hash & oldCap判断节点应该留在原位置还是移动到新的位置
- 将链表重新连接到新数组的桶中,第一条在原位置,第二条在原位置 + 原容量
详细代码
final Node<K, V>[] resize() {
Node<K, V>[] oldTab = table; // 当前使用的数组
int oldCap = (oldTab == null) ? 0 : oldTab.length; // 当前数组容量
int oldThr = threshold; // 当前扩容阈值
int newCap, newThr = 0; // 新的容量和阈值,初始化新阈值为0
// 判断旧容量
if (oldCap > 0) {
if (oldCap >= MAXIMUM_CAPACITY) {
// 如果当前容量已达到最大容量限制,就设置阈值为最大整数值,不再扩容
threshold = Integer.MAX_VALUE;
return oldTab;
} else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY