分析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元素相关推荐

  1. spring boot 跨域请求_SpringBoot 系列教程 web 篇之自定义请求匹配条件 RequestCondition...

    191222-SpringBoot 系列教程 web 篇之自定义请求匹配条件 RequestCondition 在 spring mvc 中,我们知道用户发起的请求可以通过 url 匹配到我们通过@R ...

  2. java条件触发_java – 当给定75:android时,条件不会触发

    好吧,所以这可能是一个愚蠢的问题,一个业余程序员试图尝试他的方式基本使用 Android图形,但在这里. 为了让我熟悉2D Android图形来帮助我的朋友,他希望我将他的想法用于他的游戏,我决定尝试 ...

  3. 边缘触发(Edge Trigger)和条件触发(Level Trigger)

    概述 边缘触发 是指每当状态变化时发生一个io事件: 条件触发 是只要满足条件就发生一个io事件: 详述 int select(int n, fd_set *rd_fds, fd_set *wr_fd ...

  4. 条件触发和边缘触发 及 epoll 的长处

    条件触发: 仅仅要输入缓冲有数据就会一直通知该事件 边缘触发: 输入缓冲收到数据时仅注冊1次该事件.即使输入缓冲中还留有数据,也不会再进行注冊 水平触发(level-triggered.也被称为条件触 ...

  5. 对话屏幕Dynpro(SE51) 屏幕元素 屏幕属性 PAI事件的触发、屏幕元素Function Code设置 屏幕流逻辑Screen Flow Logic 对话屏幕中的字段命名大小写问题

    对话屏幕Dynpro(SE51) 屏幕元素 屏幕属性 l  屏幕序号(Screen number).四个数字组成的序列号,用于在程序中确定屏幕,该序号在同一个ABAP程序内部是唯一的. l  屏幕类型 ...

  6. 帝国cms清除html标签,帝国CMS结合项筛选带已选择的条件和删除操作的方法

    本文实例讲述了帝国CMS结合项筛选带已选择的条件和删除操作的方法.分享给大家供大家参考.具体实现方法如下: 这个功能是在帝国的官方插件帝国官方插件-结合项列表属性筛选显示下载基础上修改而来的,(官方插 ...

  7. Elasticsearch根据条件进行删除索引命令

    以前都是按照索引中文档的id进行删除,其实Elasticsearch支持按照条件进行删除操作: 删除索引中某个type的符合条件记录: curl -XDELETE http://localhost:9 ...

  8. Elasticsearch 2.0以上版本根据条件批量删除Java如何实现

    本文转载自:http://blog.csdn.net/u014039577/article/details/51802078,仅为了个人收藏,请支持原创作者. Elasticsearch在2.0以前版 ...

  9. 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 ...

最新文章

  1. Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码)
  2. linux进程属主6,20150917 Linux进程查看与管理以及作业管理
  3. MySQL通过source命令执行sql文件
  4. python千人成像_Python实现千图成像:从图片爬取到图片合成
  5. ARM处理器指定运行核
  6. 洛谷——P1307 [NOIP2011 普及组] 数字反转
  7. 常用邮箱SMTP/POP3地址及端口
  8. 60个Java练手项目案例,看了让你茅塞顿开~
  9. Intel Optane 内存个人安装与使用步骤 Dell 灵越
  10. android获取root代码,Android获取ROOT权限的实例代码
  11. SECURITY 03: 邮件服务TLS/SSL 、 总结和答疑 、 CA数字证书服务
  12. 系统无法联系dhcp服务器,Win10专业版解决无法联系DHCP服务器错误[Ipconfig / Renew]方法...
  13. [转]如何查找最新文献
  14. python爬虫实战——青果教务网系统,并用xpath提取成绩
  15. 带你认识SSD的SATA、mSATA 、PCIe和M.2四种主流接口。联想g31t-lm2主板接线图
  16. 浅尝springboot
  17. 老鸟程序员才知道的一些事
  18. 一个简单的个人视频点播网站制作(一)
  19. C语言 —— 你不得不知道的 scanf 的高级用法
  20. 大数据时代的背景与变化

热门文章

  1. 一个简单图形界面框架XYGui的设计与实现 (一)
  2. JS实现页面返回顶部
  3. 基础设备硬件常识----体感游戏机
  4. echarts饼状图引导线加圆点
  5. 安卓手机卡顿怎么解决_【让手机更好用】安卓手机卡顿的问题,终于解决了
  6. 免费版来了,iOS和安卓手机上一定要装的浏览器!超!好!用!
  7. Unity与iOS原生代码之间的相互调用
  8. 三天吃透计算机网络八股文
  9. mysql主从数据库同步,漏掉delete操作的问题
  10. Impala 中invalidate metadata和refresh