人生哪能多如意,
萬事只求半稱心。
在日常工作中,我們經常使用HashMap,但
HashMap是無序的,這讓我們有點犯難…
所以JDK中給我們預備了LinkedHashMap,今天我們就來認識一下它。
1. LinkedHashMap的特點
LinkedHashMap 熟悉的陌生人
對於有些開發者,可能都沒直接使用過LinkedHashMap,但只要一提到LRUCache基本上都兩眼冒光,表示使用過(至少也聽說)。這種現象在我面試時非常常見,大多數面試者都表示對於LinkedHashMap不太熟悉,更別遑論其原理。
1.1 LinkedHashMap的有序性
我們知道HashMap是無序的,但這有序性分爲兩種情況:
- 對於Key按照一定的規則進行排序;典型代表 —— TreeMap;
- 對於元素的插入順序 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的優勢
- 如果開發中在使用ArrayList 和 LinkedList 時左右犯難時,那就直接採用LinkedHashMap吧。魚和熊掌二者可以兼而有之。
- 基於LinkedHashMap的訪問順序,LRU算法唾手可得。
這篇文章告訴你:LinkedHashMap這個陌生而又熟悉的東西,該考慮一下使用它啦。
下一篇:我們將會來分析LinkedHashMap的原理性東西。