JDK中hashmap實現機制

2021-10-20 21:58:16 字數 1137 閱讀 3781

軟體中時間效率是一項衡量軟體質量的關鍵指標,資料讀入與查詢是軟體中做常用的操作。jdk1.8中hashmap是採用hash表存資料,使用hash表能夠大大增強資料的查詢效率。

hash表:是乙個鍵值對(key,value),通過hash函式能夠快速的找到所需的資料,即通過乙個函式function(key)計算即可找到資料。

hash函式:hash函式演算法屬於商業型公司的核心資產,嚴格保密,一般使用者會用即可。如果hash函式做的特別好,資料雜湊無衝突,則需計算一次就可以找到相應的資料。

hash衝突:再好的hash函式,也會發生hash衝突。所謂的hash衝突就是根據key值計算出來的資料不是乙個,而是兩個或兩個以上。

jdk1.7解決hash衝突的資料結構:陣列+鍊錶,如下圖

這時查詢資料時,通過雜湊函式key值找到第乙個資料後,進行比對,如果第乙個資料不是所要的資料,沿著鍊錶全域性掃瞄,直到資料匹配為止。

jdk1.8解決hash衝突的資料結構:陣列+鍊錶+紅黑樹。jdk1.7在hash衝突時使用鍊錶來解決衝突,如果要查詢的資料在鍊錶的最後乙個,加入鍊錶有n個結點,則需要比對n次。jdk1.8對此進行改進,當衝突資料結點小於8個時,使用鍊錶,當大於8個時,則資料結構變為紅黑樹,因為使用排序樹查詢時速度要快很多。如下圖所示:

為什麼要用紅黑樹:通過排序樹查詢資料時,查詢的次數和樹的高度有關,在排序樹中平衡二叉樹的高度最低,也就是平衡二叉樹查詢效率最高,但是維護這個平衡二叉樹的演算法複雜,如增加乙個資料節點,讓這個樹繼續成為平衡二叉樹需要做多次指標變換操作。紅黑樹是研究人員給出來的一種資料結構,這種資料結構類似與平衡二叉樹,但不完全是平衡二叉樹,它具有平衡二叉樹同樣的查詢效能,同時維護平衡二叉樹簡單,最多經過三次旋轉(結點之間的指標變換)即可完成紅黑樹的維護,至於為什麼最多經過三次旋轉即可達到平衡,有嚴格的數學證明過的。

文中來自

hashmap實現機制

int uint key.gethashcode 0x8ffffff 具體多少忘記了,總之就是把它弄成正數 int index uint map.length 把value放到那個 index位置。下次訪問時再通過 key的hashcode 0x8fffff 再 map.length 就知道valu...

hashmap實現機制

int uint key.gethashcode 0x8ffffff 具體多少忘記了,總之就是把它弄成正數 int index uint map.length 把value放到那個 index位置。下次訪問時再通過 key的hashcode 0x8fffff 再 map.length 就知道valu...

JDK7與JDK8中HashMap的實現的區別

hashmap底層維護乙個陣列,陣列中的每一項都是乙個entry transient entry table 我們向 hashmap 中所放置的物件實際上是儲存在該陣列當中 而map中的key,value則以entry的形式存放在陣列中 static class entryimplements ma...