HashMap爲何存取效率那麼高?

一、Hash

也叫散列、哈希。java

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

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

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

public native int hashCode();


二、數據結構

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

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

鏈表正好相反。性能

HashMap正好將兩者互補了一下,推出了鏈表+數組的組合方式,也叫鏈表散列、「拉鍊法」。優化

結構示意圖:編碼

這裏寫圖片描述

放入元素時,根據key值經過hashcode找到對應數組的位置,放入橫向數組的某個格子中。由於前面說到hashcode值不能保證惟一,若是以後hashcode值對應的數組位置中已經有值,就放到相連的鏈表中。spa

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

代碼實現:

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

三、算法優化

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

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

思路一:

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

思路二:

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

這裏寫圖片描述

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

相關文章
相關標籤/搜索