JAVA高階基礎(12)---HashMap的資料結構及內部實現
HashMap
HashMap的工作原理
Java 8 的 HashMap 對之前做了較大的優化,其中最重要的一個優化就是桶中的元素不再唯一按照連結串列組合,也可以使用紅黑樹進行儲存,總之,目標只有一個,那就是在安全和功能性完備的情況下讓其速度更快,提升效能。
java8開始引入了紅黑樹,HashMap的資料結構(陣列+連結串列+紅黑樹),桶中的結構可能是連結串列,也可能是紅黑樹,紅黑樹的引入是為了提高效率。基於HashTable來進行儲存,就是為了加快查詢速度。
散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Ket Value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度,這個對映函式叫雜湊函式,存放記錄的陣列叫散列表。
HashMap的資料結構
說明:上圖很形象的展示了HashMap的資料結構(陣列 + 連結串列+ 紅黑樹),桶中的結構可能是連結串列,也可能是紅黑樹,紅黑樹的引入是為了提高效率。
HashMap的內部實現
搞清楚HashMap,首先需要知道HashMap是什麼,即它的儲存結構--欄位;其次是弄明白它能幹什麼,即它的功能實現--方法。
儲存結構-欄位
從結構實現來講,HashMap是 陣列 + 連結串列+ 紅黑樹實現的,如下圖所示:
(1)從原始碼可知,HashMap類中有一個非常重要的欄位,就是Node[] table,即雜湊桶陣列,明顯它是一個Node的陣列,我們來看Node是何物
Node是HashMap的一個內部類,實現了Map.Entry 介面,本質是就是一個對映(鍵值對),上圖中的每個黑色圓點就是一個Node物件。
(2)HashMap就是使用雜湊表來儲存的。
功能實現-方法
HashMap的內部功能實現很多,我們主要根據
key 獲取雜湊桶陣列索引位置、put方法的詳細執行、擴容過程三個具有代表性的點深入展開。
2、分析 HashMap 的 put 方法
小結:
- 擴容是一個特別耗效能的操作,所以當程式設計師在使用HashMap的時候,估算map的大小,初始化的時候給一個大致的數值,避免map進行頻繁的擴容。
- 負載因子是可以修改的,也可以大於1,但是建議不要輕易修改,除非情況非常特殊。
- ConcurrentHashMap是執行緒安全的,支援併發操作
- JDK1.8引入紅黑樹大程度優化了HashMap的效能。