1、概述
LinkedHashMap继承自HashMap,它能保证遍历元素时,输出的顺序和输入时的顺序相同。
LinkedHashMap不仅实现HashMap的开散列哈希表(数组+链表),还维护着一个运行于所有键值对的双向链接列表。此列表定义了迭代的顺序,该迭代顺序包括插入顺序和访问顺序两种,默认是插入顺序;可以通过设置accessOrder为true,把迭代顺序设置为访问顺序。
2、简要描述LinkedHashMap实现
LinkedHashMap与HashMap相似,它通过重写父类的方法,来实现双向链接表特性。
- public class LinkedHashMap<K, V> extends HashMap<K, V> implements Map<K, V>
LinkedHashMap采用的Hash算法和HashMap相同,不同的是它重新定义了数组保存的元素Entry。该Entry除了保存当前的对象的引用之外,还保存了它的上一个元素before和下一个元素after的引用,从而在哈希表的基础上构建一个双向链表。
- //双向链表的表头元素
- private transient Entry<K,V> header;
- /**
- * LinkedHashMap的Entry元素。
- * 继承HashMap的Entry元素,又保存了其上一个元素before和下一个元素after的引用。
- */
- private static class Entry<K,V> extends HashMap.Entry<K,V> {
- Entry<K,V> before, after;
- ……
- }
LinkedHashMap重写了父类构造函数中调用到的init方法,从而在调用父类构造方法之后,进一步完成对其元素Entry的初始化,init()方法如下:
- void init() {
- header = new Entry<K,V>(-1, null, null, null);
- header.before = header.after = header;
- }
3、迭代顺序
- //true表示按照访问顺序迭代,false时表示按照插入顺序
- private final boolean accessOrder;
4、总结
LinkedHashMap在保留HashMap的查找效率的同时,保持元素输出的顺序和输入时的顺序相同,并提供了元素的LRU访问。