LinkedHashMap及其原始碼分析(基於JDK1.7)
阿新 • • 發佈:2018-11-26
LinkedHashMap及其原始碼分析
閱讀目錄
- 什麼是LinkedHashMap
- LinkedHashMap補充說明
- LinkedHashMap的陣列結構
- LinkedHashMap繼承的類與實現的介面
- LinkedHashMap原始碼中雙向連結串列的操作
- LinkedHashMap原始碼解析,基本全部加了註釋,建議看之前,先看HashMap的原始碼
以下內容基於jdk1.7.0_79原始碼;
什麼是LinkedHashMap
繼承自HashMap,一個有序的Map介面實現,這裡的有序指的是元素可以按插入順序或訪問順序排列;
LinkedHashMap補充說明
與HashMap的異同:同樣是基於散列表實現,區別是,LinkedHashMap內部多了一個雙向迴圈連結串列的維護,該連結串列是有序的,可以按元素插入順序或元素最近訪問順序(LRU)排列,
簡單地說:LinkedHashMap=散列表+迴圈雙向連結串列
LinkedHashMap的陣列結構
用畫圖工具簡單畫了下散列表和迴圈雙向連結串列,如下圖,簡單說明下:
第一張圖是LinkedHashMap的全部資料結構,包含散列表和迴圈雙向連結串列,由於迴圈雙向連結串列線條太多了,不好畫,簡單的畫了一個節點(黃色圈出來的)示意一下,注意左邊的紅色箭頭引用為Entry節點物件的next引用(散列表中的單鏈表),綠色線條為Entry節點物件的before, after引用(迴圈雙向連結串列的前後引用);
第二張圖專門把迴圈雙向連結串列抽取出來,直觀一點,注意該迴圈雙向連結串列的頭部存放的是最久訪問的節點或最先插入的節點,尾部為最近訪問的或最近插入的節點,迭代器遍歷方向是從連結串列的頭部開始到連結串列尾部結束,在連結串列尾部有一個空的header節點,該節點不存放key-value內容,為LinkedHashMap類的成員屬性,迴圈雙向連結串列的入口;
LinkedHashMap繼承的類與實現的介面
LinkedHashMap原始碼中雙向連結串列的操作
同樣畫了一張圖,主要是插入刪除、操作,如下圖,應該挺好理解的,連結串列的操作