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

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函数



输出结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容