HashMap的底層實現原理
阿新 • • 發佈:2021-07-18
jdk7
HashMap
的底層實現原理?
以jdk7為例說明:HashMap map = new HashMap( );
在例項化以後,底層建立了長度是16的一維陣列Entry[] table。
...可能已經執行過多次put...
map.put( key1, value1):
首先,呼叫key1
所在類的hashCode()
計算key1
雜湊值,此雜湊值經過某種演算法計算以後,得到在Entry
陣列中的存放位置。
-
如果此位置上的資料為空,此時的
key1-value1
新增成功。----情況1 -
如果此位置上的資料不為空,(意味著此位置上存在一個或多個數據(以連結串列形式存在),比較
key1
和已經存在的一個或多個數據的雜湊值:- 如果
key1
的雜湊值與已經存在的資料的雜湊值都不相同,此時key1-value1
新增成功。----情況2 - 如果
key1
的雜湊值和已經存在的某一個數據(key2-value2)
的雜湊值相同,繼續比較:呼叫key1所在類的equals(key2)。- 如果
equals()
返回false
:此時key1-value1
新增成功。----情況3 - 如果
equals()
返回true
:使用value1
替換value2
。
- 如果
- 如果
補充:關於情況2和情況3:此時key1-value1
和原來的資料以連結串列的方式儲存。
擴容方式:
擴容為原來的2倍,並將原有資料複製過來。
jdk8
new HashMap()
- jdk8 底層陣列為
Node[]
,而非Entry[]
- 首次呼叫
put()
方法時,底層建立長度為16的陣列 - jdk7 只有陣列 + 連結串列, jdk8中底層結構:陣列 + 連結串列 + 紅黑樹。
- 當陣列的某一個索引位置上的元素以連結串列形式存在的資料個數>8,且當前陣列的長度>64時,此時此索引位置上的所有資料改為使用紅黑樹儲存。
DEFAULT_INITIAL_CAPACITY
:HashMap的預設容量,16
DEFAULT_LOAD_FACTOR
:HashMap的預設載入因子:0.75
threshold
:擴容的臨界值,=容量 * 填充因子:16 * 0.75 => 12
TREEIFY_THRESHOLD
:Bucket中連結串列長度大於該預設值,轉化為紅黑樹:8
MIN_TREEIFY_CAPACITY
:桶中的Node被樹化時最小的nash表容量:64