hashmap初始容量16,但數值大於64並且鍊錶長度大於等於8的時候,轉成紅黑樹,但小於6時又退回陣列加鍊表結構,每一次擴容又二分之一的機率以前存入的數不需要改變位置,因為15的二進位制與31的二進位制相差一位,
當存入數hash計算後的二進位制的的倒數第五位是0時,它&15或&31的結果都一樣.
以hashmap執行put方法為切入點,**理解hashmap的原理;通過這個方法 了解hashmap 在內部是如何進行資料儲存的,陣列+鍊錶+紅黑樹的儲存結構是如何形成的,又是在何種情況下將鍊錶轉換成紅黑樹來優化效能的
public v put
(k key, v value)
/*我們put方法傳入了key和value,它會呼叫putval方法會返回五個值
hash(key):計算了key的hash值,等下看它時如何計算的;
*/
static
final
inthash
(object key)
/*這個方法十分精妙,它做了什麼,為什麼要這麼返回:
顯而易見:key為null時返回0,當不為0的時候它做了乙個異或操作;
異或的左邊時key的hash值,右邊是這個hash值右移16位後的值,
其實就是把key的hash值的前16位跟後16位異或了一下,使這個返回的值更加雜湊了.減少了碰撞率(就是減少了hash值相等的情況);
*/
//
final v putval
(int hash, k key, v value,
boolean onlyifabsent,
boolean evict)
//遍歷的過程中,如果發現與某個結點的 hash和key,這依然是一次修改操作
if(e.hash == hash &&
((k = e.key)
== key ||
(key != null && key.
equals
(k))))
break
; p = e;}}
//e 不是 null,說明當前的 put 操作是一次修改操作並且e指向的就是需要被修改的結點
if(e != null)
}//e 不是 null,說明當前的 put 操作是一次修改操作並且e指向的就是需要被修改的結點
++modcount;if(
++size > threshold)
resize()
;afternodeinsertion
(evict)
;return null;
}
HashMap原理解析
日常工作中經常用到map,基本上是用map map new hashmap 來得到乙個hashmap物件,之前並未深入去研究hashmap的實現原理,只是去簡單的去建立然後使用它。這次想深入了解便,去研究了一下hashmap的原始碼。做點筆記,記錄一下自己的一些收穫,想到哪寫到哪吧。hashmap繼...
HashMap原理解析
hashmap在jdk1.8之前和jdk1.8之後內部實現有所不同 在jdk1.8之前,hashmap底層是陣列和鍊錶的結構,從jdk1.8開始內部實現使用了陣列和鍊錶以及紅黑樹一 jdk1.8之前的hashmap實現原理 以jdk1.7為例 先看構造方法 public hashmap public...
HashMap的原理解析
進行hashmap原理解析 手寫乙個簡單的hashmap hashmap的底層執行是陣列加鍊表 鍊錶就是為了解決雜湊碰撞的情況 public class hashmap 關羽的hash值是 679082 index is 2 孫權的hash值是 751370 index is 5 張飛的hash值是...