继承LinkedHashMap实现自定义HashMap设定条件触发删除eldest元素
分析LinkedHashMap
LinkedHashMap是继承HashMap的一个子类,除了包含HashMap的方法外,还提供了removeEldestEntry方法,该方法在源码中实现:
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {return false;
}
该方法好像没什么作用,先不要这么快急着下结论,让我们先看看该方法在哪里被调用了。
上源码:
void addEntry(int hash, K key, V value, int bucketIndex) {super.addEntry(hash, key, value, bucketIndex);// Remove eldest entry if instructedEntry<K,V> eldest = header.after;if (removeEldestEntry(eldest)) {removeEntryForKey(eldest.key);}
}
看到该调用,貌似能看出这个方法的作用了,当removeEldestEntry返回true时执行removeEntryForKey删除eldest的entry(LRU即Least Recently Used,最近最少使用),可是前面源码中removeEldestEntry方法的实现永远返回false,就是说,removeEntryForKey方法永远不会执行。
再看看哪里调用了addEntry方法:
public V put(K key, V value) {if (table == EMPTY_TABLE) {inflateTable(threshold);}if (key == null)return putForNullKey(value);int hash = hash(key);int i = indexFor(hash, table.length);for (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;e.recordAccess(this);return oldValue;}}modCount++;addEntry(hash, key, value, i);return null;
}
可以看到,在put方法中调用了,再分析一下逻辑,好像removeEldestEntry的作用呼之欲出了。
猜测:当该集合put key-value时,会执行removeEldestEntry方法检查条件(例:集合容量满了),就返回true,删除eldest元素,释放空间。
继承LinkedHashMap实现特定条件删除eldest元素
先定义一个类继承LinkedHashMap
public class LRUHashMap<K, V> extends LinkedHashMap<K, V>{private final int MAX_CACHE_SIZE;public BaseLRUCache(int cacheSize) {super(cacheSize, 0.75f, true);MAX_CACHE_SIZE = cacheSize;}@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return size() > MAX_CACHE_SIZE;}public abstract void removeKey(String key);}
LRUHashMap就是自定义的一个继承LinkedHashMap的类,该类除了拥有LinkedHashMap的所以方法外,还重写了removeEldestEntry方法,该方法的意义是当LRUHashMap集合的子元素达到某个阈值MAX_CACHE_SIZE后返回true。
然后回顾前面addEntry方法
if (removeEldestEntry(eldest)) {removeEntryForKey(eldest.key);
}
该条件满足,则删除eldest元素。
这个东西用途还是比较多的,例如:当实现本地缓存的时候,如果缓存的内容达到某个阈值的时候,可以把最近最少使用的元素删除,释放空间给新元素使用。
但是回顾addEntry方法:
Entry<K,V> eldest = header.after;
if (removeEldestEntry(eldest)) {removeEntryForKey(eldest.key);
}
eldest对象好像永远是第一个元素(非header),那么LRUHashMap的最佳实现应该是重写该addEntry方法,加入某些(LRU等)算法选择权重值最低的对象作为eldest对象被remove。
继承LinkedHashMap实现自定义HashMap设定条件触发删除eldest元素相关推荐
- spring boot 跨域请求_SpringBoot 系列教程 web 篇之自定义请求匹配条件 RequestCondition...
191222-SpringBoot 系列教程 web 篇之自定义请求匹配条件 RequestCondition 在 spring mvc 中,我们知道用户发起的请求可以通过 url 匹配到我们通过@R ...
- java条件触发_java – 当给定75:android时,条件不会触发
好吧,所以这可能是一个愚蠢的问题,一个业余程序员试图尝试他的方式基本使用 Android图形,但在这里. 为了让我熟悉2D Android图形来帮助我的朋友,他希望我将他的想法用于他的游戏,我决定尝试 ...
- 边缘触发(Edge Trigger)和条件触发(Level Trigger)
概述 边缘触发 是指每当状态变化时发生一个io事件: 条件触发 是只要满足条件就发生一个io事件: 详述 int select(int n, fd_set *rd_fds, fd_set *wr_fd ...
- 条件触发和边缘触发 及 epoll 的长处
条件触发: 仅仅要输入缓冲有数据就会一直通知该事件 边缘触发: 输入缓冲收到数据时仅注冊1次该事件.即使输入缓冲中还留有数据,也不会再进行注冊 水平触发(level-triggered.也被称为条件触 ...
- 对话屏幕Dynpro(SE51) 屏幕元素 屏幕属性 PAI事件的触发、屏幕元素Function Code设置 屏幕流逻辑Screen Flow Logic 对话屏幕中的字段命名大小写问题
对话屏幕Dynpro(SE51) 屏幕元素 屏幕属性 l 屏幕序号(Screen number).四个数字组成的序列号,用于在程序中确定屏幕,该序号在同一个ABAP程序内部是唯一的. l 屏幕类型 ...
- 帝国cms清除html标签,帝国CMS结合项筛选带已选择的条件和删除操作的方法
本文实例讲述了帝国CMS结合项筛选带已选择的条件和删除操作的方法.分享给大家供大家参考.具体实现方法如下: 这个功能是在帝国的官方插件帝国官方插件-结合项列表属性筛选显示下载基础上修改而来的,(官方插 ...
- Elasticsearch根据条件进行删除索引命令
以前都是按照索引中文档的id进行删除,其实Elasticsearch支持按照条件进行删除操作: 删除索引中某个type的符合条件记录: curl -XDELETE http://localhost:9 ...
- Elasticsearch 2.0以上版本根据条件批量删除Java如何实现
本文转载自:http://blog.csdn.net/u014039577/article/details/51802078,仅为了个人收藏,请支持原创作者. Elasticsearch在2.0以前版 ...
- Java 集合List、Set、HashMap操作二(Map遍历、List反向、Set删除指定元素,集合只读、TreeMap操作、List转Array、List移动元素)
Map遍历 import java.util.Map; import java.util.HashMap; import java.util.HashSet; import java.util.Ite ...
最新文章
- Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码)
- linux进程属主6,20150917 Linux进程查看与管理以及作业管理
- MySQL通过source命令执行sql文件
- python千人成像_Python实现千图成像:从图片爬取到图片合成
- ARM处理器指定运行核
- 洛谷——P1307 [NOIP2011 普及组] 数字反转
- 常用邮箱SMTP/POP3地址及端口
- 60个Java练手项目案例,看了让你茅塞顿开~
- Intel Optane 内存个人安装与使用步骤 Dell 灵越
- android获取root代码,Android获取ROOT权限的实例代码
- SECURITY 03: 邮件服务TLS/SSL 、 总结和答疑 、 CA数字证书服务
- 系统无法联系dhcp服务器,Win10专业版解决无法联系DHCP服务器错误[Ipconfig / Renew]方法...
- [转]如何查找最新文献
- python爬虫实战——青果教务网系统,并用xpath提取成绩
- 带你认识SSD的SATA、mSATA 、PCIe和M.2四种主流接口。联想g31t-lm2主板接线图
- 浅尝springboot
- 老鸟程序员才知道的一些事
- 一个简单的个人视频点播网站制作(一)
- C语言 —— 你不得不知道的 scanf 的高级用法
- 大数据时代的背景与变化