最详细HashMap集合源码讲解(resize()方法)
1 HashMap中resize()的作用
resize()是HashMap中扩容的方法,当HashMap中存的数据量大于threshold时或进行初始化HashMap的时候会进行扩容的操作,即执行resize()方法进行扩容
1.1 执行resize()方法两种情况分析
1.1.1 在HashMap的putVal()方法中,会先判断table是否为空,如果为空的话,会执行resize(),然后就初始化table,代码如下
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
1.1.2 在HashMap中的存储的数据量大于threshold时,会执行resize()方法,代码如下
在putVal()方法中,size表示当前HashMap的数据量,如果size大于threshold,则会执行该方法,进行扩容操作
if (++size > threshold)
resize();
1.2 resize()方法的原理及源码分析
// resize即使table初始化的方法,也是扩容的方法
final Node<K,V>[] resize() {
//使用oldTab存储旧的table数组表
java.util.HashMap.Node<K,V>[] oldTab = table;
// 得到旧的table数组的长度,然后把值赋给oldCap,如果oldTab是为null,则把oldCap赋值为0
int oldCap = (oldTab == null) ? 0 : oldTab.length;
//用oldThr 存储旧hashMap的threshold;注意:threshold=数组长度*负载因子
int oldThr = threshold;
int newCap = 0;
int newThr = 0;
//如果旧的数组长度大于零
if (oldCap > 0) {
//旧的数组容量大于MAXIMUM_CAPACITY = 1 << 30即1073741824
//则把新的数组长度设为2147483647
if (oldCap >= MAXIMUM_CAPACITY) {
threshold = <