-
LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题
image.png
afterNodeAccess执行逻辑
image.png- 默认情况下,LinkedHashMap 是按插入顺序维护链表。不过我们可以在初始化 LinkedHashMap,指定 accessOrder 参数为 true,即可让它按访问顺序维护链表。
- 访问顺序维护链表accessOrder=true,并且尾节点tail不等于当前访问的节点,
- 获取当前节点前驱节点和后继节点;
- 1、如果当前节点的前驱节点为null,
- 则把当前节点赋值给头节点head;
- 否则把当前节点的后继节点赋值给当前节点的前驱节点指向的后继节点;(相当与断开当前节点的链接信息);
- 2、如果当前节点的后继节点不为null;
- 则把当前节点的前驱节点赋值给当前节点的后继节点指向的前驱节点;
- 否则把当前节点的前驱节点赋值给临时节点last;
- 3、如果临时节点last为null,
- 则把头节点head指向当前节点;
- 否则更换尾节点,把临时节点last赋值给当前节点前驱节点(即原来的尾节点变成当前尾节点的前驱节点)、把当前节点赋值给last节点的后继节点(即原来的尾节点的后继由null变为指向当前节点)。
- 最后将尾节点指向当前节点。
注意: 上面的执行逻辑只有在指定accessOrder 参数为 true时,即按访问顺序维护链表,才会执行,这中情况下遍历的结果集的输出顺序也是按照之前元素的访问顺序输出的。
网友评论