讀HashMap 原始碼 jdk11 的見解

2022-05-18 17:42:11 字數 885 閱讀 5644

如果想系統詳細的了解hashmap請移步各大佬部落格。這篇文章只是個人的一些見解。

陣列+鍊錶 或 陣列+紅黑樹。這種說法感覺有迷惑性。

之前看部落格都說 hashmap 的儲存是陣列+鍊錶(jdk6), 或者陣列+鍊錶 和 陣列+紅黑樹 共存(jdk8)(我電腦上沒有jdk7所以沒有驗證jdk7是怎樣儲存的)。

我認為描述成鍊錶型別的陣列 或者 紅黑樹型別的陣列是不是更好理解

下面是hashmap的put方法的一部分

可以看到新增的資料是以node型別的物件新增到陣列裡的。  看乙個node的定義

單鏈表的資料結構。 jdk6,直接儲存的是entry這個類。後來應該是增加了treenode,就把entry定義成了乙個介面。

2. 不是用key的hash值直接去定址的

是用的陣列長度-1(n-1) 和 key的hash值(hash)做 & (與)運算的結構定址的。 下面是我向hashmap中插入一條資料時(插入之前hashmap是空)debug的資訊

可以看到 hash=55608   i=(n-1)&hash  值 是8。如果直接用key的hash去尋值。這個陣列得有多大。

ThreadLocal 原始碼分析 jdk1 6

相信很多做分布式web開發的都封裝過這樣的乙個工具用來管理當前登入的使用者。在 裡面把使用者set進來 在controller 裡面get 出來使用 而且都是基於threadlocal 這個模板類來封裝的,出於好奇跟蹤進原始碼一 竟 這裡簡單寫個例子 public class baseloginco...

JDK原始碼學習 HashMap

什麼是hash?hash的意思是 雜湊 音譯做 雜湊 輸入乙個任意長度的資料,進過雜湊運算之後,輸出一段固定長度的資料,作為輸入資料的指紋,輸出的結果就是雜湊值。一般來說輸入資料的空間遠遠大於輸出的雜湊值的空間,輸入不同的資料可能會產生相同的雜湊值,所以很難從雜湊值來逆向推出輸入值是什麼。雜湊函式本...

JDK原始碼之HashMap

部分重要屬性 存放key,value的陣列 transient node table 存放entry的set transient set entryset hashmap的大小 預設16 transient int size 修改次數 transient int modcount 擴擴容閾值capa...