Hashmap中它与其他后处理方法都是空实现

// Callbacks to allow LinkedHashMap post-actions
void afterNodeAccess(Node<K,V> p) { }
void afterNodeInsertion(boolean evict) { }
void afterNodeRemoval(Node<K,V> p) { }

LinkedHashMap中实现如下(LinkedHashMap继承了Hashmap)

    void afterNodeInsertion(boolean evict) { // possibly remove eldestLinkedHashMap.Entry<K,V> first;if (evict && (first = head) != null && removeEldestEntry(first)) {K key = first.key;removeNode(hash(key), key, null, false, true);}}
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {return false;}

在LinkedHashMap中这个方法removeEldestEntry永远返回false,如果为true走的是移除head节点的逻辑。head节点就是最开始插入map的节点,也可以称为最旧的节点。

所以可以知道if判断永远是false,所以什么逻辑也不走。

但是我们先记住if判断里的条件,下面有用

可以看出这些后处理方法不是给LinkedHashMap类和HashMap类使用的。用于继承了LinkedHashMap类的类使用,例如LRUCache,这个类所有代码如下

public class LRUCache<K, V> extends LinkedHashMap<K, V> {private static final long serialVersionUID = 1L;protected int maxElements;public LRUCache(int maxSize) {super(maxSize, 0.75F, true);this.maxElements = maxSize;}@Overrideprotected boolean removeEldestEntry(Entry<K, V> eldest) {return (size() > this.maxElements);}
}

LRUCache中重写了这个方法,作用是当当前链表大小大于最大容量时,移除一个最旧的元素,因为removeEldestEntry方法返回true,而且HashMap的put方法最后会调用            afterNodeInsertion(true);这个方法的if判断只会判断三个条件,

第一个是传入的evict参数true还是false,evict英文是驱逐的意思,

第二个是当前head节点不为空

第三个则就是removeEldestEntry方法返回的参数

因此当LRUCache put元素时,会在put元素后调用后处理方法AfterNodeInsertion,它内部if条件判断里再调用removeEldestEntry方法,如果removeEldestEntry方法返回true,且头结点不为空,put方法默认调用后处理方法evict参数就是true,if条件判断3个条件都成立,所以LRUCache 此时会移除head节点。

AfterNodeInsertion方法相关推荐

  1. 彻底理解HashMap及LinkedHashMap

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://blog.csdn.net/fuzhongmin05/article/details/104355841 Ha ...

  2. java 最少使用(lru)置换算法_「面试」LRU了解么?看看LinkedHashMap如何实现LRU算法...

    以下内容均是本人原创,希望你看完之后能有更多更深入的了解,欢迎关注➕ 问题:使用Java完成一个简单的LRU算法 什么是LRU算法 LRU(Least Recently Used),也就是最近最少使用 ...

  3. HashMap原理总结

    来总结一下HashMap的原理 1.HashMap当中有一个内部类,它叫Node,然后这个Node呢,它其实是实现了Map.Entry接口,这个接口当中有几个抽象的方法和几个具体的方法.其中Map.E ...

  4. 缓存框架OSCache部分源码分析

    在并发量比较大的场景,如果采用直接访问数据库的方式,将会对数据库带来巨大的压力,严重的情况下可能会导致数据库不可用状态,并且时间的消耗也是不能容忍的,尤其对于某些获取起来比较昂贵的数据.在这种情况下, ...

  5. LinkedHashMap 的理解以及借助其实现LRU

    LinkedHashMap 的理解以及借助其实现LRU LinkedHashMap中有一个参数 accessOrder,这个参数定义了LinkedHashMap的访问顺序. LinkedHashMap ...

  6. 容器源码解析之LinkedHashMap(九)

    1.LinkedHashMap的继承结构 public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map&l ...

  7. Java类集框架 —— LinkedHashMap源码分析

    前言 我们知道HashMap底层是采用数组+单向线性链表/红黑树来实现的,HashMap在扩容或者链表与红黑树转换过程时可能会改变元素的位置和顺序.如果需要保存元素存入或访问的先后顺序,那就需要采用L ...

  8. 面试官系统精讲Java源码及大厂真题 - 09 TreeMap 和 LinkedHashMap 核心源码解析

    09 TreeMap 和 LinkedHashMap 核心源码解析 更新时间:2019-09-05 10:15:03 人的影响短暂而微弱,书的影响则广泛而深远. --普希金 引导语 在熟悉 HashM ...

  9. Java集合(二、LinkHashMap)

    继承自HashMap,需要先查看"HashMap"一文先了解 要点总结 1.LinkHaspMap继承自HashMap,除了HashMap遍历无序的外,其余特性,比如扩容机制.ke ...

最新文章

  1. 【神经网络】(1) 简单网络,实例:气温预测,附python完整代码和数据集
  2. 中传计算机应用研究生分数线,2018中国传媒大学考研复试分数线(含2016-2018年)...
  3. springaop事务逻辑原理_太狠了!阿里大牛手写的Spring核心面试笔记:IOC+AOP+MVC+事务...
  4. Redis 高级教程 Redis 分区(6)
  5. 【Python基础】Pandas数据可视化原来也这么厉害
  6. 启动django服务器报错raise errorclass(errno, errval) django.db.utils.InternalError
  7. django简介及环境搭建
  8. AI 赛道“新选手”锐捷发布新一代 AI SaaS 云平台,支撑百万级零售货柜
  9. 计算机计算资源估计,项目时间管理中的计算题三点估算和关键路径法
  10. ( 转)Hibernate常用API
  11. 点击验证码时候自动刷新功能
  12. 手机浏览器打开微信小程序,支持外部浏览器跳转到小程序
  13. distill_bert和tiny_bert
  14. 【Latex】Latex调整行间距
  15. js 超简单 判断是否字符串是否为纯数字
  16. Linux群组与用户
  17. Android工程师面试准备知识点
  18. java pkcs7 和 pkcs5_PKCS5Padding与PKCS7Padding的区别
  19. 标点符号中英文互译(翻译)
  20. 2023免费PPT网站12个

热门文章

  1. cycleInterpolator 循环加速器
  2. elementUI使用v-for创建无限级导航栏—— 递归组件
  3. 洛谷P1095 守望者的逃离 (从未感觉DP如此清晰, 所以这是DP吗2333)
  4. 【C++基础系列】Vector容器
  5. 微软家族的首个跨平台开发工具 Visual Studio Code
  6. 【算法】有限状态机FSM
  7. 如何借用淘宝巧获海量精准流量?
  8. 关于SG/SP, GG/GP的一点个人理解
  9. 离线安装python库
  10. 基于AT89C51单片机的智能浇花系统设计