1. 程式人生 > >從原始碼分析HashMap實現原理

從原始碼分析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()賦值

純屬個人筆記,有疑問請評論。