最近面試被問到了hashmap原始碼,所以再次認真學習整理一下(基於jdk1.7)。
hashmap主要由陣列和鍊錶組成,陣列是hashmap的主體,鍊錶是為了解決hash衝突而設計的。entry是hashmap的基本組成單元。每個entry包含一對key-value的鍵值對。
entry主要包括四個屬性,key,value,hash,entrynext,其中hash為key進行hash運算後的值,next為下乙個entry的引用,當next為null時不存在hash衝突。當hash查詢時若next為null,直接返回當前value,若next不為空,則進行鍊錶遍歷並比較key實體,查詢指定的key。
size:鍵值對數量
capacity:陣列大小。預設初始值為16。擴容大小為2的n次方。
threshold:陣列擴容的閥值。capacity*loadfactor,當陣列長度超過閥值,陣列進行擴容。
loadfactor:陣列填充度,預設0.75
當呼叫put方法時,先判斷是否需要擴容,然後判斷hash是否衝突,若沒有衝突則生成新的節點並放入陣列中。如果衝突則進行遍歷鍊錶,如果鍊錶中已經存在key則直接進行替換,否則在鍊錶結尾新增節點。
呼叫get方法時類似,先對key進行hash計算,然後找到key對應的陣列下標,遍歷鍊錶取值。
jdk1.8對hashmap進行了優化,主要修改部分為entry換為node,當鍊表長度超過8時採用紅黑樹結構。
未完待續...
HashMap原始碼學習
自己在學習的時候總感覺看懂了又沒有看懂,總有一層霧,所以乾脆寫個博文,看能不能徹底弄懂。測試用 hashmapmap new hashmap map.put 1 2 map.put 2 4 map.put 3 6 map.put 4 8 map.put 5 1 map.put 6 1 map.put...
HashMap原始碼學習
最大容量 2的30次方 static final int maximum capacity 1 30 預設的載入因子 static final float default load factor 0.75f 雜湊桶,存放鍊錶。長度是2的n次方,或者初始化時為0.transient node tabl...
HashMap原始碼學習筆記
hashmap的底層主要是基於陣列和鍊錶來實現的,它之所以有相當快的查詢速度主要是因為它是通過計算雜湊碼來決定儲存的位置。hashmap中主要是通過key的hashcode來計算hash值的,只要hashcode相同,計算出來的hash值就一樣。如果儲存的物件對多了,就有可能不同的物件所算出來的ha...