1. 程式人生 > 其它 >HashMap的底層實現原理

HashMap的底層實現原理

jdk7

HashMap的底層實現原理?
以jdk7為例說明:HashMap map = new HashMap( );
在例項化以後,底層建立了長度是16的一維陣列Entry[] table。
...可能已經執行過多次put...
map.put( key1, value1):

首先,呼叫key1所在類的hashCode()計算key1雜湊值,此雜湊值經過某種演算法計算以後,得到在Entry陣列中的存放位置。

  1. 如果此位置上的資料為空,此時的key1-value1新增成功。----情況1

  2. 如果此位置上的資料不為空,(意味著此位置上存在一個或多個數據(以連結串列形式存在),比較key1和已經存在的一個或多個數據的雜湊值:

    1. 如果key1的雜湊值與已經存在的資料的雜湊值都不相同,此時key1-value1新增成功。----情況2
    2. 如果key1的雜湊值和已經存在的某一個數據(key2-value2)的雜湊值相同,繼續比較:呼叫key1所在類的equals(key2)。
      1. 如果equals()返回false:此時key1-value1新增成功。----情況3
      2. 如果equals()返回true:使用value1替換value2

補充:關於情況2和情況3:此時key1-value1和原來的資料以連結串列的方式儲存。

擴容方式:
擴容為原來的2倍,並將原有資料複製過來。

jdk8

  1. new HashMap()
    : 底層沒有建立一個長度為16的陣列
  2. jdk8 底層陣列為Node[],而非Entry[]
  3. 首次呼叫put()方法時,底層建立長度為16的陣列
  4. jdk7 只有陣列 + 連結串列, jdk8中底層結構:陣列 + 連結串列 + 紅黑樹。
  5. 當陣列的某一個索引位置上的元素以連結串列形式存在的資料個數>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