一、LinkedHashMap 概述
摘自JDKAPI-1.6版本部分解释:LinkedHashMap 是哈希表和链接列表实现,HashMap 也是哈希表和链接列表实现的,与HashMap 的不同之处在于 LinkedHashMap 中的链接列表是双向链表。LinkedHashMap 是有序的,该迭代顺序是将键插入到映射中的顺序(插入顺序)。LinkedHashMap 提供特殊的构造方法来创建哈希映射,该映射的迭代顺序就是最后访问其元素的顺序,从近期访问最少到近期访问最多的顺序(访问顺序),这种适合映射关系适合构建 LRU 缓存。为初始容量选择非常高的值对此类的影响比对 HashMap 要小,因为此类的迭代时间不受容量的影响。允许 null 元素,是不同步的。
二、总结 LinkedHashMap 的关键点
1、LinkedHashMap 的迭代时间不受容量影响,HashMap 受容量影响。
2、LinkedHashMap 允许 null 键、null 值,线程不同步。
3、LinkedHashMap 是基于 HashMap 实现的,与之不同之处在于前者是双向链表,后者是单向链表,同时 LinkedHashMap 提供特殊的构造方法,适合构建 LRU 缓存。
4、LinkedHashMap 是有序的,按照策略区分为插入顺序和访问顺序。
三、结论分析
1、为什么 LinkedHashMap 的迭代时间不受容量影响?
因为它自定义了迭代器以及迭代规则,是通过内部的双向链表来完成迭代的,遍历时间与键值对总数成正比。
2、为什么 LinkedHashMap 适合构建 LRU 缓存,LRU 缓存是什么?
LRU,最少访问算法。如果把已经访问过的数据存在内存中,新 put 进去的和被 get 的元素被放置到了最后,那么最终留在头部的就是一直没有被访问或者访问次数最少的数据。当容器被存满时,如果新存入数据,头部的数据将被删除,新数据被存到容器的尾部。可以在 LinkedHashMap 的基础上重写 removeEldestEntry 方法来实现上述描述的算法。即扩展 LinkedHashMap ,在类中定义成员 MAXSIZE,最终返回 size() > MAXSIZE。
在调用 LinkedHashMap 的 get 和 put 方法时,都会把操作的条目放到容器的最底部,按照上面 LRU 的描述,正好符合其数据结构,所以适合实现。
四、总结
LinkedHashMap 是 HashMap 的子类,除了结论分析中的两点与 HashMap 不同之外,其他几乎没有差别,如果想有更多的了解,参看 HashMap 总结篇。