03.04 HashMap發生碰撞後怎麼取碰撞的元素?

愛玩機的小毛毛


首先你得知道什麼是hash碰撞!

當有數據存入哈希表時,先使用hash算法(其實就是一種壓縮策略)計算數據的hash值,然後存入相應的數組中作為元素!因為是使用壓縮,所以毫無疑問的會產生衝突,兩個不同數據的hash值是一樣的(比如hash算法是取模,101%10和91%10是一樣的1作為hash值),這就是hash衝突,或者叫做hash碰撞!


解決hash碰撞主要有以下幾種方式:

1,開放地址法:在發生hash碰撞的時候,採用一定的策略(比如線性查找該元素後面的空位放入,或者隨機數探測方法等)將新的數據放入滿足策略的空位置!

2,再哈希法:使用多種hash算法,當產生衝突的時候,使用下一種算法,直到找到空位插入為止,如果hash碰撞比較嚴重,使用這種方法會大大增加hash計算時間!

3,鏈地址法:把每個數組的元素看做鏈表,變為數組+鏈表的數據形式,在發生衝突的時候,把新數據插入到對應元素的鏈表中!

舉個例子,比方說一個250000的數據,如果使用尋常的方式順序查找,需要125000次比較,而如果使用hash表(假設是十分均勻的hash表,數組是500個元素,鏈表是500個節點),則只需要500/2+500/2=500次比較,就可以查到!效率從O(N)降到了O(1)常量級別!


很多語言中都有hash的實現,而在JDK中使用的就是鏈地址法來解決哈希衝突的,不過在j d k8中,當鏈表節點數大於8的時候,會自動轉換成紅黑樹,進一步提升了查詢的效率!

hashmap是面試中常常提及的點,需要重點關注下,一直走在JAVA開發技術分享的道路上,從不停歇,敬請關注!!


此生唯一


首先,要知道HashMap的實現,HashMap是採用數組+鏈表的數據結構,數組是用做於散列的桶,由於無法確保散列值唯一,也就是問題中的衝突碰撞,這時衝突碰撞就由鏈表結構來解決。


再講鏈表是如何解決衝突碰撞,當出現哈希值相同時,就把衝突的元素也就是鍵值對添加進哈希值對應桶的鏈表中,查詢元素時通過遍歷鏈表來實現。

但是當桶數目較小,散列後衝突碰撞產生太多就會造成鏈表過長,從而大大降低了查詢效率,所以在jdk1.8後為了解決這個問題,在判定鏈表過長就會從鏈表結構轉換為紅黑樹結構(一種平衡二叉樹結構),查詢效率由O(n)變為log(n),大大提高。


以上便是本學生對hashmap的理解和了解,希望能幫助到你,如果有錯誤請指出互相學習。


分享到:


相關文章: