深入浅出LinkedHashMap
介绍
可以看做是HashMap+LinkedList,它即使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序,内部采用双向的形式将所有元素连接起来。
-
继承自HashMap,大多数方法没有重写比如remove、put方法
-
一个key被重新插入,顺序不受影响
-
非同步,可以调用Collections来实现类同步
-
assess-ordered结构性的修改会响应遍历的顺序的
-
迭代有序
-
比HashMap多了一个双向链表的维护,大多数方法都由HashMap实现了。
-
底层是散列表加双向链表
-
插入的顺序是有序的(底层链表导致有序)
-
可以用来实现最近LRU算法,是页面置换算法常用的一种。
-
提供了map应用的算法,允许为null,不同步,可以调用Collection来实现同步
-
与HashMap一样,初始容量和装载因子对LinkedHashMap影响很大,但它遍历时初始容量是不受有序性
-
其可以设置两种遍历顺序:
- 访问顺序
- 插入顺序(默认情况)
结构图
首先先看一下LinkedHashMap的类继承图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h2DaVFWu-1595400107143)(https://raw.githubusercontent.com/iszhonghu/Picture-bed/master/img/20200721111121.png)]
分析
参数
- 继承HashMap的Node节点,它是双向链表,包含前置指针和后置指针
- 在构件新节点时,构件的是LinkedHashMap.Entry不再是Node。
方法
构造方法
- 调用的是HashMap的构造方法,并且默认使用的是插入顺序。
put方法
没有重写,直接调用的是HashMap的put方法。只是在创建节点的时候,调用的是LinkedHashMap重写的方法。
get方法
public V get(Object key) {
Node<K,V> e;
if ((e = getNode(hash(key), key)) == null)
return null;
if (accessOrder)
afterNodeAccess(e);
return e.value;
}
- 调用HashMap定义的方法获取对应的节点
- 如果是访问顺序的时候,把该节点放到链表的最后面
remove方法
LinkedHashMap并没有重写remove方法,只是重写了afterNodeRemoval方法。
遍历方法
从内部维护的双链表的表头开始循环输出,因为遍历的是双向链表,而不是散列表,所以初始容量对遍历没有影响