從原始碼分析HashMap實現原理
HashMap
基於雜湊表的 Map 介面的實現。此實現提供所有可選的對映操作,並允許使用 null 值和 null 鍵。(除了不同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證對映的順序,特別是它不保證該順序恆久不變。另外,HashMap是非執行緒安全的,也就是說在多執行緒的環境下,可能會存在問題,而Hashtable是執行緒安全的。
HashMap繼承抽象類AbstractMap,實現Cloneable, Serializable介面。
AbstractMap實現Map介面。
HashMap的主幹是陣列,由陣列和連結串列組成(鏈和樹)
capacity一定是2的次冪
loadFactor 閾閥 預設為0.75
threshold = capacity * loadFactor 閾值
hash演算法不相同,其中一種hash = (h = key.hashCode()) ^ (h >>> 16)
查詢下標如果遇到相同hash,則查詢連結串列
HashMap內部方法欄位
先看四個建構函式:
這個方法用於找到大於等於initialCapacity的最小的2的冪
DEFAULT_LOAD_FACTOR = 0.75f
MAXIMUM_CAPACITY = 1 << 30
因此,loadFactor預設為0.75,threshold最大為1073741824
使用putMapEntries初始化
table如下,是一個不需要序列化的Node
Node是實現了Entry的內部類,每個節點包括雜湊數,鍵,值,下個節點的引用,
但節點的hashCode是鍵值異或生成的,equals判斷鍵值。
resize()擴容
hash()
key的高16位不變,低16位與高16位異或。
下標計算index =(table.length -1) & hash
putVal()賦值
純屬個人筆記,有疑問請評論。