源码分析

集合17-LinkedHashMap(1.8)源码分析

2017-06-11  本文已影响0人  zhanglbjames

LinkedHashMap继承自HashMap,除了具有HashMap的功能之外,还维持了一个双向链表用来按照插入或访问的顺序记录所有Entry。

1- LinkedHashMap继承结构



LikedHashMap继承自HashMap,通过重写HashMap中的多个方法来实现对LikedHashMap中双向链表的插入和删除,从而保证能按照元素插入或者访问顺序迭代所有元素。

2- 构造函数




accessOrder默认为false,即为插入顺序,另外还需要提供initialCapacity、loadFactor用来初始化HashMap,当然不指定则使用默认值。

3- 顺序遍历的实现

最后插入或者最后访问的节点位于双向链表的尾部。

1. 双向链表节点
保存双向链表的head和tail节点
继承自HashMap.Node,双向链表节点。
双向链表的尾部添加

双向链表的取代已存节点的操作


2. 重写HashMap中钩子方法来实现顺序迭代

普通节点的插入和替代


树节点的插入和替代


删除

访问顺序的支持

afterNodeAccess(需要注意:将访问的节点移动到链表的尾部


重写get方法以支持访问顺序

LRU(删除最近最少使用)缓存更新策略场景的支持


HashMapput方法会将evict参数设置为true;removeEldestEntry方法默认返回false,如果要实现LRU则需根据业务场景重写此方法

4- 顺序迭代器

基于LikedHashMap的双向链表的迭代器实现,实现比较简单

5- 利用LinkedHashMap实现LRU的简单例子

继承LinkedHashMap然后重写removeEldestEntry方法



测试main函数



输出结果
上一篇 下一篇

猜你喜欢

热点阅读