内容来自《收割 Offer:互联网大厂面经》

首先解释几个与扩容有关的参数:

一般情况下,当HashMap 中包含的键值对数量大于 threshold 时会触发扩容,容量扩大为原来的两倍。

JDK1.7 版本,HashMap 底层数据结构为数组和链表,扩容时新建数组,遍历旧数组的每个桶和桶中的每个键值对,将其 rehash 到扩容后的新数组,然后插入链表。

JDK1.8 版本,底层数据结构为数组、链表和红黑树,当 HashMap 中键值对数量大于阈值、HashMap 数组长度为0或升级成红黑树时,数组长度小于6都会触发扩容。扩容流程如下:

同一个桶中的键值对属于low还是high,详细说明见“为什么HashMap是二倍扩容,容量总为2的n次幂”。