一、简介
- HashMap的源码我们之前解读过,数组加链表,链表过长时裂变为红黑树。自动扩容机制没细说,今天详细看一下
往期回顾:
- Java1.7的HashMap源码分析-面试必备技能
- Java1.8的HashMap源码分析-面试必备技能
二、扩容机制
先说结论:
- hashmap的容量都是2的倍数,比如2,4,8,16,32,64 ...
- 每次扩容都是扩一倍,2到4 ,4到8,8到16, 16到32 等等
- 扩容因子:默认是0.75,也可以指定一个小数
- 扩容时间点:当容器内的元素数量到达:容量*扩容因子 开始扩容
三、源码分析
(1)先看构造函数
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
static final float DEFAULT_LOAD_FACTOR = 0.75f;
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
默认的构造函数指定了扩容因子:0.75, 默认容量是16
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
指定初始容量,默认扩容因子:0.75
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
同时指定初始容量和扩容因子
/**
* The next size value at which to resize (capacity * load factor).
*
* @serial
*/
int thres