人生哪能多如意,
万事只求半称心。
在日常工作中,我们经常使用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的原理性东西。