《java性能調優》3.HashMap的設計與優化

HashMap 作爲我們日常使用最頻繁的容器之一,相信你一定不陌生了。今天我們就從 HashMap 的底層實現講起,深度瞭解下它的設計與優化。

常用的數據結構
ArrayList 是基於數組的數據結構實現的,LinkedList 是基於鏈表的數據結構實現的,而我今天要講的 HashMap 是基於哈希表的數據結構實現的。我們不妨一起來溫習下常用的數據結構,這樣也有助於你更好地理解後面地內容。

數組:採用一段連續的存儲單元來存儲數據。對於指定下標的查找,時間複雜度爲 O(1),但在數組中間以及頭部插入數據時,需要複製移動後面的元素。
鏈表:一種在物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。
鏈表由一系列結點(鏈表中每一個元素)組成,結點可以在運行時動態生成。每個結點都包含“存儲數據單元的數據域”和“存儲下一個結點地址的指針域”這兩個部分。
由於鏈表不用必須按順序存儲,所以鏈表在插入的時候可以達到 O(1) 的複雜度,但查找一個結點或者訪問特定編號的結點需要 O(n) 的時間。
哈希表:根據關鍵碼值(Key value)直接進行訪問的數據結構。通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做哈希函數,存放記錄的數組就叫做哈希表。
:由 n(n≥1)個有限結點組成的一個具有層次關係的集合,就像是一棵倒掛的樹。

HashMap 的實現結構
瞭解完數據結構後,我們再來看下 HashMap 的實現結構。作爲最常用的 Map 類,它是基於哈希表實現的,繼承了 AbstractMap 並且實現了 Map 接口。

哈希表將鍵的 Hash 值映射到內存地址,即根據鍵獲取對應的值,並將其存儲到內存地址。也就是說 HashMap 是根據鍵的 Hash 值來決定對應值的存儲位置。通過這種索引方式,HashMap 獲取數據的速度會非常快。

例如,存儲鍵值對(x,“aa”)時,哈希表會通過

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章