日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JDK源码学习04-寄生虫LinkedHashMap

發(fā)布時(shí)間:2024/3/24 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK源码学习04-寄生虫LinkedHashMap 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

活久見(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)方法。

# 這是HashMap留給LinkedHashMap的后門(mén),// Callbacks to allow LinkedHashMap post-actions// 如果hashmap的節(jié)點(diǎn)被更新 則調(diào)用該方法void afterNodeAccess(Node<K,V> p) { }// 如果hashmap插入節(jié)點(diǎn) 則調(diào)用該方法void afterNodeInsertion(boolean evict) { }// 如果hashmap刪除節(jié)點(diǎn) 則調(diào)用該方法void afterNodeRemoval(Node<K,V> p) { }

這是我調(diào)試的時(shí)候截的圖,可以看出,LinkedHashMap按順序存儲(chǔ)了雙向鏈表結(jié)構(gòu),而HashMap也按hash存儲(chǔ)了數(shù)據(jù),每個(gè)數(shù)據(jù)都被存儲(chǔ)了兩次,并且結(jié)構(gòu)體也不同

  • 我們可以發(fā)現(xiàn)LinkedHashMap繼承于HashMap,在HashMap已經(jīng)實(shí)現(xiàn)Map接口的情況下,LinkedHashMap仍然實(shí)現(xiàn)了Map接口,實(shí)現(xiàn)Map接口會(huì)要求LinkedHashMap實(shí)現(xiàn)所有Map接口的方法。
  • public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>
  • 我們可以發(fā)現(xiàn),LinkedHashMap包含的函數(shù)非常少,甚至不包含put方法,這是因?yàn)長(zhǎng)inkedHashMap繼承了HashMap的put等方法。
  • 我們來(lái)看看LinkedHashMap如何從HashMap獲取數(shù)據(jù),來(lái)維護(hù)自己的雙向鏈表。
    • LinkedHashMap重寫(xiě)了HashMap的newNode方法,每次HashMap需要插入節(jié)點(diǎn)的時(shí)候都需要newNode函數(shù),這樣LinkedHashMap就能夠通過(guò)linkNodeLast§;來(lái)維護(hù)雙向鏈表了。
    Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {LinkedHashMap.Entry<K,V> p =new LinkedHashMap.Entry<K,V>(hash, key, value, e);linkNodeLast(p);return p;}

    核心維護(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。