深入理解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的原理性东西。

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