Java集合之LinkedHashMap

小樓昨夜又西風發表於2019-03-18

在這裡插入圖片描述
在這裡插入圖片描述
三、LinkedHashMap基本結構

關於LinkedHashMap,先提兩點:

1、LinkedHashMap可以認為是HashMap+LinkedList(特別重要: 關鍵的理解點),即它既使用HashMap運算元據結構,又使用LinkedList維護插入元素的先後順序。

2、LinkedHashMap的基本實現思想就是----多型。可以說,理解多型,再去理解LinkedHashMap原理會事半功倍;反之也是,對於LinkedHashMap原理的學習,也可以促進和加深對於多型的理解。
在這裡插入圖片描述
看到,LinkedHashMap是HashMap的子類,自然LinkedHashMap也就繼承了HashMap中所有非private的方法。再看一下LinkedHashMap中本身的方法:
在這裡插入圖片描述
看到LinkedHashMap中並沒有什麼運算元據結構的方法,也就是說LinkedHashMap運算元據結構(比如put一個資料),和HashMap運算元據的方法完全一樣,無非就是細節上有一些的不同罷了。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
解釋:上述圖充分解釋了LinkedHashMap可以認為是HashMap+LinkedList的結合體。
在這裡插入圖片描述
在這裡插入圖片描述
解釋: 上述圖充分解釋了LinkedHashMap可以認為是HashMap+LinkedList的結合體。(相當於在hashmap的基礎上加入了before,after指標指向插入順序前後的節點)

下圖是直接抽出LinkedHashMap中LinkedList的部分,要知道這抽出的部分可能是跨多個bucket的節點組成的鏈條
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
解釋: 下圖中的new Entry()是構造的頭節點,具體可以看下面第2張圖
在這裡插入圖片描述
小疑問:既然linkedHashMap重寫了HashMap裡面的init方法,那為什麼還是初始化16個bucket呢?不是已經重寫了init方法了嗎?
在這裡插入圖片描述
五、LinkedHashMap儲存元素

LinkedHashMap並未重寫父類HashMap的put方法,而是重寫了父類HashMap的put方法呼叫的子方法void recordAccess(HashMap m) ,void addEntry(int hash, K key, V value, int bucketIndex) 和void createEntry(int hash, K key, V value, int bucketIndex),提供了自己特有的雙向連結列表的實現。

繼續看LinkedHashMap儲存元素,也就是put(“111”,“111”)做了什麼,首先當然是呼叫HashMap的put方法:
在這裡插入圖片描述
第23行又是一個多型,因為LinkedHashMap重寫了addEntry方法,因此addEntry呼叫的是LinkedHashMap重寫了的方法:
在這裡插入圖片描述
因為LinkedHashMap由於其本身維護了插入的先後順序,因此LinkedHashMap可以用來做快取(解釋:這就是LinkedHashMap可以做快取的原因),第7行~第9行是用來支援FIFO演算法的,這裡暫時不用去關心它。看一下createEntry方法:
在這裡插入圖片描述
更多詳情參考連結:
https://www.cnblogs.com/xiaoxi/p/6170590.html

之所以LinkHashMap能夠實現LRU快取的理由:
get()方法通過key獲取value,與HashMap的區別是:當LinkedHashMap按訪問順序排序的時候,會將訪問的當前節點移到連結串列尾部(頭結點的前一個節點),也就是說每次訪問之後就放到連結串列尾部,實現最近最久未使用的淘汰機制,淘汰頭部(解釋:特別重要

相關文章