深入理解Java之LinkedHashMap —— 04

人生哪能多如意,
萬事只求半稱心。


在日常工作中,我們經常使用HashMap,但

HashMap是無序的,這讓我們有點犯難…

所以JDK中給我們預備了LinkedHashMap,今天我們就來認識一下它。


1. LinkedHashMap的特點

LinkedHashMap 熟悉的陌生人

對於有些開發者,可能都沒直接使用過LinkedHashMap,但只要一提到LRUCache基本上都兩眼冒光,表示使用過(至少也聽說)。這種現象在我面試時非常常見,大多數面試者都表示對於LinkedHashMap不太熟悉,更別遑論其原理。

1.1 LinkedHashMap的有序性

我們知道HashMap是無序的,但這有序性分爲兩種情況:

  1. 對於Key按照一定的規則進行排序;典型代表 —— TreeMap
  2. 對於元素的插入順序 or 訪問順序進行排序;典型代表 —— LinkedHashMap

這篇文章咱們主要來討論 LinkedHashMap

1.1.1 LinkedHashMap的插入順序

簡而言之,就是FIFO(先進先出),其它操作不影響其順序。這也是LinkedHashMap的默認順序

1.1.2 LinkedHashMap的訪問順序

LRU(Least Recently Used) 其原理是:如果一個數據在最近一段時間沒有被訪問到,那麼在將來它被訪問的可能性也很小。

訪問(get/put操作) 時,其對應的Key-Value將會移動到雙向鏈表尾部(若Key-Value存在,則本質上是先刪除再插入)。
需要注意的是:雙向鏈表尾部表示的是最近訪問的,其頭部最久沒有訪問的。(PS:尾插法)

舉例說明一下:

  	HashMap<String,Integer>  linkedMap = new LinkedHashMap<String, Integer>(16,0.75f,true);
    linkedMap.put("first",1);
    linkedMap.put("second",2);
    linkedMap.put("third",3);
    linkedMap.get("second");
    System.out.println(linkedMap); // {first=1, third=3, second=2}

1.2 LinkedHashMap的優勢

  1. 如果開發中在使用ArrayListLinkedList 時左右犯難時,那就直接採用LinkedHashMap吧。魚和熊掌二者可以兼而有之。
  2. 基於LinkedHashMap的訪問順序LRU算法唾手可得。

這篇文章告訴你:LinkedHashMap這個陌生而又熟悉的東西,該考慮一下使用它啦。

下一篇:我們將會來分析LinkedHashMap的原理性東西。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章