JDK源码学习04-寄生虫LinkedHashMap
活久見的LinkedHashMap
隨便聊聊
筆者大三,在2021.1.18入職字節實習生,干了四十天就休假跑路回去上課了。最近一大段時間過的非常松懈,現在報復性瘋狂發布博客,哈哈。還是決定閱讀JDK源碼,從集合開始,希望能夠讀完核心的集合、AQS、線程池在等部分,最近對Java并發比較感興趣也比較有體會,鬼知道能不能堅持到那個時候。筆者的文章可能不夠詳細,但會記錄下來個人覺得比較核心的內容。
 聯系方式:qq 754647431
LinkedHashMap簡介
核心原理:
LinkedHashMap的底層結構是:由于繼承而產生的HashMap父類|LinkedHashMap自己的雙向鏈表
 所以LinkedHashMap只不過是在HashMap的基礎上額外維護了一個雙向鏈表罷了,僅此而已
 那么問題來了:LinkedHashMap是如何在自己實現一點點方法的基礎上,利用到HashMap中呢?
 -----實際上是LinkedHashMap重寫了HashMap的newNode函數,額外添加了一句話linkNodeLast§;這樣就實現了在插入時維護雙向鏈表,但是刪除元素非常復雜,需要仔細看源碼才行。這里先放下HashMap留給LinkedHashMap的后門方法。
這是我調試的時候截的圖,可以看出,LinkedHashMap按順序存儲了雙向鏈表結構,而HashMap也按hash存儲了數據,每個數據都被存儲了兩次,并且結構體也不同
 
- LinkedHashMap重寫了HashMap的newNode方法,每次HashMap需要插入節點的時候都需要newNode函數,這樣LinkedHashMap就能夠通過linkNodeLast§;來維護雙向鏈表了。
 
核心維護雙向鏈表的函數
// link at the end of listprivate void linkNodeLast(LinkedHashMap.Entry<K,V> p) {// 獲取雙向鏈表尾節點 用來實現尾插LinkedHashMap.Entry<K,V> last = tail;// 尾節點指向新節點tail = p;// 如果雙向鏈表尾空 設置頭節點指向新節點 此時頭尾都指向新節點if (last == null)head = p;else {// 原尾節點與新節點雙向奔赴p.before = last;last.after = p;}}總結
以上是生活随笔為你收集整理的JDK源码学习04-寄生虫LinkedHashMap的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: day18总结和作业
 - 下一篇: 4 轮拿下腾讯 Offer (附真题)