HashMap爲什麼存取效率那麼高?

1、Hash

也叫散列、哈希。

主要用於信息安全領域中的算法,把長度不同的信息轉化爲雜亂的128位的編碼,找到一種數據內容與地址之間的映射關係。

注意:不同的輸入可能會散列成相同的輸出

我們最熟悉的Object類中就提供了hashcode的方法。

public native int hashCode();


2、數據結構

Java集合的實現底層大都是基本數據結構的又一層封裝。

數組:尋址容易,插入和刪除困難

鏈表正好相反。

HashMap正好將二者互補了一下,推出了鏈表+數組的組合方式,也叫鏈表散列、“拉鍊法”。

結構示意圖:

這裏寫圖片描述

放入元素時,根據key值通過hashcode找到對應數組的位置,放入橫向數組的某個格子中。因爲前面說到hashcode值不能保證唯一,如果之後hashcode值對應的數組位置中已經有值,就放到相連的鏈表中。

查找元素也是按這個過程來進行。

代碼實現:

注意:每個Node中都持有下一個節點的引用。
這裏寫圖片描述

3、算法優化

由上面的數據結構介紹,可以看出,在查找的時候,儘量避免查找鏈表能夠大大提高存取效率。

目標:元素儘可能均勻分佈,這樣查找的時候不必查找鏈表,效率很高。

思路一:

取模運算,實現是可以實現,但取模運算消耗大、效率不高。

思路二:

首先,&運算比取模運算效率高。
hashmap採用的是下面這種與運算。

這裏寫圖片描述

大同小異,都是爲了減少碰撞,避免hash到同一個位置,使元素分佈更均勻。在實現的基礎上,考慮性能問題。

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