HashMap的底層實現原理

2021-10-06 18:33:12 字數 2625 閱讀 3067

以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 相較於jdk7在底層實現方面的不同:

*      1. new hashmap():底層沒有建立乙個長度為16的陣列

*      2. jdk 8底層的陣列是:node,而非entry

*      3. 首次呼叫put()方法時,底層建立長度為16的陣列

*      4. jdk7底層結構只有:陣列+鍊錶。jdk8中底層結構:陣列+鍊錶+紅黑樹。

*         4.1 形成鍊錶時,七上八下(jdk7:新的元素指向舊的元素。jdk8:舊的元素指向新的元素)

4.2 當陣列的某乙個索引位置上的元素以鍊錶形式存在的資料個數 > 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被樹化時最小的hash表容量:64

**二、linkedhashmap的底層實現原理(了解)

*      原始碼中:

*      static class entryextends hashmap.node

}* 補充注意 :一map結構的理解:

* map中的key:無序的、不可重複的,使用set儲存所有的key ---> key所在的類要重寫equals()和hashcode() (以hashmap為例)

* map中的value:無序的、可重複的,使用collection儲存所有的value --->value所在的類要重寫equals()

* 乙個鍵值對:key-value構成了乙個entry物件。 * map中的entry:無序的、不可重複的,使用set儲存所有的entry 

*二,map的實現類的結構:

*  |----map:雙列資料,儲存key-value對的資料   ---類似於高中的函式:y = f(x)

*         |----hashmap:作為map的主要實現類;執行緒不安全的,效率高;儲存null的key和value

*              |----linkedhashmap:保證在遍歷map元素時,可以按照新增的順序實現遍歷。

*                      原因:在原有的hashmap底層結構基礎上,新增了一對指標,指向前乙個和後乙個元素。

*                      對於頻繁的遍歷操作,此類執行效率高於hashmap。

*         |----treemap:保證按照新增的key-value對進行排序,實現排序遍歷。此時考慮key的自然排序或定製排序

*                      底層使用紅黑樹

*         |----hashtable:作為古老的實現類;執行緒安全的,效率低;不能儲存null的key和value

*              |----properties:常用來處理配置檔案。key和value都是string型別**

*      hashmap的底層:陣列+鍊錶  (jdk7及之前)

*                    陣列+鍊錶+紅黑樹 (jdk 8)

hashmap底層實現原理

每次初始化hashmap都會構造乙個table陣列,而table陣列的元素為entry節點。static class entryimplements map.entryhashmap也可以說是乙個陣列鍊錶,hashmap裡面有乙個非常重要的內部靜態類 entry,這個entry非常重要,它裡面包含了...

HashMap底層實現原理

hashmap map new hashmap 在例項化以後,底層建立了長度為16的一維陣列entry table 已經執行過put操作.map.put key1 value1 呼叫key1所在類的hashcode 計算key1雜湊值,此雜湊值經過某種演算法計算後,得到在entry陣列中的存放位置 ...

HashMap底層實現原理

一 jdk1.7中hashmap的底層實現原理 首先,當我們通過hashmap的構造方法建立乙個hashmap物件時,底層就會建立乙個entry型別的一維陣列 預設初始化長度為16 當我們執行put操作的時候,會呼叫key所屬類的hashcode方法計算出key的hash值,然後將hash值通過雜湊...