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函数
输出结果
网友评论