也叫散列、哈希。java
主要用於信息安全領域中的算法,把長度不一樣的信息轉化爲雜亂的128位的編碼,找到一種數據內容與地址之間的映射關係。算法
注意:不一樣的輸入可能會散列成相同的輸出數組
咱們最熟悉的Object類中就提供了hashcode的方法。安全
public native int hashCode();
Java集合的實現底層大都是基本數據結構的又一層封裝。markdown
數組:尋址容易,插入和刪除困難數據結構
鏈表正好相反。性能
HashMap正好將兩者互補了一下,推出了鏈表+數組的組合方式,也叫鏈表散列、「拉鍊法」。優化
結構示意圖:編碼
放入元素時,根據key值經過hashcode找到對應數組的位置,放入橫向數組的某個格子中。由於前面說到hashcode值不能保證惟一,若是以後hashcode值對應的數組位置中已經有值,就放到相連的鏈表中。spa
查找元素也是按這個過程來進行。
代碼實現:
注意:每一個Node中都持有下一個節點的引用。
由上面的數據結構介紹,能夠看出,在查找的時候,儘可能避免查找鏈表可以大大提升存取效率。
目標:元素儘量均勻分佈,這樣查找的時候沒必要查找鏈表,效率很高。
思路一:
取模運算,實現是能夠實現,但取模運算消耗大、效率不高。
思路二:
首先,&運算比取模運算效率高。
hashmap採用的是下面這種與運算。
大同小異,都是爲了減小碰撞,避免hash到同一個位置,使元素分佈更均勻。在實現的基礎上,考慮性能問題。