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