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