底層的兩個變量
- loadFactor:加載因子,默認是0.75(是經過反復測試的)
- threshold:當map里面的數據大於該值就會進行擴容(threshold=容量*加載因子)
HashMap提供四種構造方法:一是給定初始容量和加載因子的構造方法,二是給定初始容量,使用默認的加載因子,三是什么參數都不給,使用默認的初始容量和默認的加載因子,四是傳進一個Map,使用默認的加載因子。
但是,無論使用什么構造方法,HashMap都沒有進行初始化容量設置,都是一個空的HashMap,這就是HashMap的懶加載機制,只有當你第一次添加元素,才會進行第一次的容量設置。
第一次擴容(分兩種情況):
第一種:沒有設置初始化容量,使用默認的DEFAULT_INITIAL_CAPACITY=16進行初始化設置;
第二種:設置了初始化容量;當設定值是2的n次方時,就按該值設置,否則,會找到樂意大於該值的但是最接近的2的n次方的值進行設置
第二次擴容:
在容量不大於最大值(1<<30,即1073741824)的情況下,默認都是擴容為兩倍:
新容量 = 舊容量*2
新threshold = 新容量*負載因子
如果容量超出了這個數,則不再增長,且閾值會被設置為Integer.MAX_VALUE( 2^31-1,即永遠不會超出閾值了)。