Java集合之LinkedHashMap
三、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按訪問順序排序的時候,會將訪問的當前節點移到連結串列尾部(頭結點的前一個節點),也就是說每次訪問之後就放到連結串列尾部,實現最近最久未使用的淘汰機制,淘汰頭部(解釋:特別重要)
相關文章
- Java集合——LinkedHashMapJavaHashMap
- 死磕 java集合之LinkedHashMap原始碼分析JavaHashMap原始碼
- Java集合框架分析(五)LinkedHashMap分析Java框架HashMap
- HashMap與LinkedHashMap型別集合HashMap型別
- Java集合系列(四):HashMap、Hashtable、LinkedHashMap、TreeMap的使用方法及區別JavaHashMap
- Java集合之HashMapJavaHashMap
- Java 集合之ArrayListJava
- Java 集合之LinkedListJava
- java集合之CopyOnWriteArrayListJava
- Java集合之ArrayListJava
- Java之Properties集合Java
- Java——LinkedHashMap原始碼解析JavaHashMap原始碼
- 搞懂 Java LinkedHashMap 原始碼JavaHashMap原始碼
- LinkedHashMap的特殊之處HashMap
- Java集合系列之---HashMapJavaHashMap
- Java高階特性之集合Java
- java基礎:LinkedHashMap — 原始碼分析JavaHashMap原始碼
- Java集合(5)之 List 總結Java
- Java集合之Hashtable原始碼解析Java原始碼
- Java集合之ArrayList原始碼解析Java原始碼
- Java 集合(2)之 Iterator 迭代器Java
- Java集合之LinkedList原始碼解析Java原始碼
- 理解分析java集合操作之ConcurrentModificationExceptionJavaException
- Java基礎之淺談集合Java
- LinkedHashMapHashMap
- 帶你走進Java集合之ConcurrentHashMapJavaHashMap
- Java集合(6)之 HashMap 原始碼解析JavaHashMap原始碼
- Java 集合系列之 LinkedList原始碼分析Java原始碼
- 帶你走進Java集合之HashMapJavaHashMap
- Java集合原始碼分析之開篇Java原始碼
- 帶你走進Java集合之ArrayListJava
- Java之常見異常 整理集合Java
- 面試必備 之 Java 集合框架面試Java框架
- 死磕 java集合之終結篇Java
- 再說Java集合,subList之於ArrayListJava
- Android基礎之Java集合框架CollectionAndroidJava框架
- Java 集合(1)之 總體架構Java架構
- Java中HashMap,LinkedHashMap,TreeMap的區別[轉]JavaHashMap