当前位置: 首页 > 编程日记 > 正文

LInkedHashMap实现最近被使用(LRU)缓存

在最近的面试中,我曾被多次问到,怎么实现一个最近最少使用(LRU)的缓存。缓存可以通过哈希表来实现,然而为这个缓存增加大小限制会变成另一个有意思的问题。现在我们看一下怎么实现。

最近最少使用缓存的回收

为了实现缓存回收,我们需要很容易做到:

  • 查询出最近最晚使用的项
  • 给最近使用的项做一个标记

链表可以实现这两个操作。检测最近最少使用的项只需要返回链表的尾部。标记一项为最近使用的项只需要从当前位置移除,然后将该项放置到头部。比较困难的事情是怎么快速的在链表中找到该项。

哈希表的帮助

看一下我们工具箱中的数据结构,哈希表可以在(消耗)常量的时间内索引到某个对象。如果我们创建一个形如key->链表节点的哈希表,我们就能够在常量时间内找到最近使用的节点。更甚的是,我们也能够在常量时间内判断节点的是否存在(或不存在);

找到这个节点后,我们就能将这个节点移动到链表的最前端,标记为最近使用的项了。

Java的捷径

据我所知,很少有一种编程语言的标准库中有通用的数据结构能提供上述功能的。这是一种混合的数据结构,我们需要在哈希表的基础上建立一个链表。但是Java已经为我们提供了这种形式的数据结构-LinkedHashMap!它甚至提供可覆盖回收策略的方法(见removeEldestEntry文档)。唯一需要我们注意的事情是,改链表的顺序是插入的顺序,而不是访问的顺序。但是,有一个构造函数提供了一个选项,可以使用访问的顺序(见文档)。

无需多说:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.LinkedHashMap;
import java.util.Map;
public LRUCache<K, V> extends LinkedHashMap<K, V> {
  private int cacheSize;
  public LRUCache(int cacheSize) {
    super(16, 0.75, true);
    this.cacheSize = cacheSize;
  }
  protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
    return size() >= cacheSize;
  }
}

转载于:https://www.cnblogs.com/myf008/p/8504336.html

相关文章:

2019年9月2日开学!寒假时间也定了……

原文&#xff1a; https://mp.weixin.qq.com/s/Dns-ucDwuDeR7lNSlibyAA 放假通知 今年7月1日放暑假 9月2日开学 今天&#xff0c;省教育厅发布通知&#xff0c;2019年全省中小学幼儿园暑期放假时间统一为7月1日&#xff0c;秋季开学时间9月2日。2020年寒假放假时间为1月18日&am…

Vue 增加动态路由功能 【在原有系统上增加】

目录 遇到问题 1. 修改router/index.js 2. 修改 store文件夹下的 2.1 增加 modules/permission.js 2.2 增加modules/tagsViews.js 2.3 修改modules/user.js 2.4 修改getter.js 2.5 修改index.js 遇到问题 1.当出现循环刷新页面&#xff0c;不断进行请求时&#xff0c;检查配…

读取 android的内存、cpu、流量等 信息

内存总量&#xff1a;/proc/meminfocpu信息&#xff1a;/proc/cpuinfocpu使用率&#xff1a;/proc/stat流量信息&#xff1a;/proc/self/net/dev /proc/net/devetc/network/interfaces 这个文件是保存ip,netmask,gateway信息的&#xff08;包括静态和动态&#xff09;&#xff…

CCNA基础知识汇总

本资源是本人学习的过程中的一些笔记和学习中用到的文档。主要包括ospf&#xff0c;ppp&#xff0c;ACL与策略路由&#xff0c;帧中继&#xff0c;***方面。希望能对大家CCNA的学习有所帮助。下载地址&#xff1a;http://down.51cto.com/data/128047 转载于:https://blog.51cto…

PHP面试内容 整理搜集 PHP面试涉及技术 一文回顾全部 主要含PHP面试命令列表 方法列表...

PHP面试时常涉及的内容总结 熟悉框架 逻辑题 快排 正则 数组函数....抽奖, 秒杀数据库 优化,sql书写缓存 redis mecacheLinux命令其他技术 sphinx, swool 异步处理,(同步异步 分布式)其他语言 Java python(多线程 爬虫) go c(一般温个别的)PHP7新特性 整理制作 https://www.cn…

Python 文件 close() 方法

描述 Python 文件 close() 方法用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作&#xff0c; 否则会触发 ValueError 错误。 close() 方法允许调用多次。 当 file 对象&#xff0c;被引用到操作另外一个文件时&#xff0c;Python 会自动关闭之前的 file 对象。 使用…

校园音乐点歌平台的设计与开发 微信小程序 推荐点歌 java 开发

1、 微信小程序前台展示 &#xff08;基于协同过滤算法 根据用户点歌行为 对用户点歌进行推荐&#xff09; 2 、 使用到的技术框架 Springbootmavenmybatis网易云相关API 3、 后台展示 项目地址&#xff1a; 项目地址

Code Reading -chap4

Chapter4: C Data Structures 67. Read explicit data structure operations in terms of the underlying abstract data class.(P96) 依据显式数据结构背后的抽象数据类去阅读该显式数据结构操作。 &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xf…

在Red Hat Linux5下构建LAMP网站服务平台之MySQL、PHP的安装与配置

在Red Hat Linux5下构建LAMP网站服务平台之MySQL、PHP的安装与配置 2010-09-09 16:40:49标签&#xff1a;PHP Linux mysql RedHat    [推送到技术圈] 版权声明&#xff1a;原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和…

移动端iPhone系列适配问题的一些坑

完成移动端的开发项目之后&#xff0c;发现谷歌自带的调试器似乎没有什么太大的作用&#xff0c;整天借同事的苹果手机测bug,尽管同事不厌其烦&#xff0c;但还是觉得这iPhone系列适配问题适配到想逃逃逃&#xff0c;好在项目已经顺利完成&#xff0c;测试通过&#xff0c;下面…

shred命令

不做陈冠希必备。。。。 shred --help 用法&#xff1a;shred [选项]... 文件... Overwrite the specified FILE(s) repeatedly, in order to make it harder for even very expensive hardware probing to recover the data.Mandatory arguments to long options are mandator…

WPF初探--RichTextBox

1. 设置RichTextBox运行换行 将AcceptReturn属性设置为true 2. 保存RichTextBox内容到文件 //path为完整保存路径名 private void SaveRtfFile(string path) { FileStream fs new FileStream(path, FileMode.Create); TextRange range; range new TextRange(your…

手把手视频第一节

个人的总结&#xff1a; 今天又重新开始看一套单片机视频&#xff0c;算上这一套已经是第三套了&#xff0c;也总结了一些教训。首先是在抄代码的时候不明白的地方就算后来明白了也要加注释&#xff0c;解释这句话的意思&#xff0c;否则以后看的时候一定是一脸懵逼。 手把手第…

异步操作(三)

APM的轮询聚焦技巧 就从字面意思来理解&#xff0c;每隔一段时间来查询&#xff0c;异步操作的结果。而怎么实现轮询的方法了&#xff0c;这里就要谈到IAsyncResult接口。它定义了若干个只读属性 publicinterfaceIAsyncResult{ Object AsyncState {get;} WaitHandle AsyncWaitH…

Django-C002-深入模型,到底有多深

此文章完成度【100%】留着以后忘记的回顾。多写多练多思考&#xff0c;我会努力写出有意思的demo&#xff0c;如果知识点有错误、误导&#xff0c;欢迎大家在评论处写下你的感想或者纠错。 ORM介绍&#xff1a;对象关系映射&#xff08;英语&#xff1a;(Object Relational Map…

Linux中断流程分析

裸机中断&#xff1a; 1、中断流入口 2、事先注册中断处理程序 3、根据中断源编号&#xff0c;调取处理程序 irq_svc&#xff1a;1、等到产生中断源的编号&#xff08;每一个中断号都有一个描述结构&#xff09; 2、转载于:https://www.cnblogs.com/sanshijvshi/p/8531025.html…

手把手视频第二节

一、单片机的三大内部资源&#xff08;我们作为用户&#xff0c;单片机可以提供给我们的资源&#xff09; 1、FALSH&#xff08;程序存储空间&#xff09; &#xff08;1&#xff09;早期使用的一般是TOPROM &#xff0c;程序只能写入一次&#xff0c;程序写错了只能换一块。 &…

SQL Server DATEADD() 函数

定义和用法 DATEADD() 函数在日期中添加或减去指定的时间间隔。 语法 DATEADD(datepart,number,date) date 参数是合法的日期表达式。number 是您希望添加的间隔数&#xff1b;对于未来的时间&#xff0c;此数是正数&#xff0c;对于过去的时间&#xff0c;此数是负数。 datepa…

致广大关注《网络规划设计师考试案例梳理、真题透解与强化训练》读者朋友的一封信...

致广大关注《网络规划设计师考试案例梳理、真题透解与强化训练》读者朋友的一封信 书是人类进步的阶梯&#xff0c;读书是增强个人软实力的佳径。好读书是你的美德&#xff0c;读好书是你的选择&#xff0c;书好读是我们的承诺&#xff01;如果有心&#xff0c;不妨把一卷《网络…

Mac MySQL 数据库配置(关系型数据库管理系统)

本文已停止更新&#xff0c;点击此链接查看本文最新内容 &#xff01;&#xff01;&#xff01;前言 MySQL 关系型数据库管理系统。1、配置准备工作 1&#xff09;配置数据库准备工作 下载相关软件 mysql-5.7.21-1-macos10.13-x86_64.dmgmysql-workbench-community-6.3.10-maco…

SSM框架——Spring+SpringMVC+Mybatis的搭建教程

一&#xff1a;概述SSM框架在项目开发中经常使用到&#xff0c;相比于SSH框架&#xff0c;它在仅几年的开发中运用的更加广泛。 Spring作为一个轻量级的框架&#xff0c;有很多的拓展功能&#xff0c;最主要的我们一般项目使用的就是IOC和AOP。SpringMVC是Spring实现的一个Web层…

【java】兴唐课程第五节到第九节知识点总结

第九节 1、 代码&#xff1a;void readBook(String… bookNames) 表示不确定参数的个数&#xff0c;此时变量为一个数组。 2、当方法中的参数名称(如stuname)和属性名称相同时。 this.stuname表示属性 stuname表示参数。 3、主方法与所在的累无关&#xff0c;是一个程序的入口…

构建RHEL上的extmail

一、extmail_solutionz 1、ExtMail Solution 结构 ExtMail Solution 是一个基于优秀开源软件的电子邮件系统解决方案&#xff0c;核心部件包括了Postfix、Amavisd-new、ClamAV、ExtMail、ExtMan、Courier系列软件。是一个功能相对比较齐全的免费电子邮件系统。以下是其主要的特…

MapReduce_wordcount

测试数据&#xff1a; [hadooph201 mapreduce]$ more counttext.txt hello mamahello babahello wordcai wen weimama baba jiejie gegegege jiejie didimeimei jiejiedidi mamaayi shushuayi mamahello mamahello babahello wordcai wen weimama baba jiejie gegegege jiejie …

Appium+python自动化(八)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 下(超详解)...

​简介 通过上一篇宏哥给各位小伙伴们的引荐&#xff0c;大家移动对这位美女有了深刻的认识&#xff0c;而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里&#xff0c;是不是这样呢&#xff1f;&#xff1f;&#xff1f;不要害羞直接告诉宏哥&#xff1a;是&#xff0c;就…

蜻蜓resin服务器虚拟目录的设置

首先&#xff0c;别急着打开服务器先&#xff0c;接住打开resin主目录下的conf文件夹的resin.conf文件&#xff0c;老规矩&#xff0c;备份先&#xff0c;mv resin.conf resin.conf.bak然后vi resin.conf 文件&#xff0c;找到如下这段代码&#xff1a;1 <!--configures the…

【java】兴唐第十节课知识点总结

1、使用main里的成员方法也要实例化对象吗&#xff1f; 必须实例化 ///重点&#xff01; 2、在成员方法中调用另一个成员方法可以直接调用&#xff08;前面省略一个this.&#xff09; 3、 \n也可以在java里用 4、null可以是除了基本数据类型外的任何数据类型 5、基本数据类…

SharePoint2010是个什么东西

Microsoft SharePoint Foundation is an application that is built on top of Internet Information Services (IIS) and the Microsoft ASP.NET Framework. Microsoft SharePoint Foundation 是架构在IIS和ASP.NET Framework上的一个应用程序。IIS是与互联网站点相关的&#…

Linux Shell高级技巧(目录)

为了方便我们每个人的学习&#xff0c;这里将给出Linux Shell高级技巧五篇系列博客的目录以供大家在需要时参阅和查找。 Linux Shell高级技巧(一) http://www.cnblogs.com/stephen-liu74/archive/2011/12/22/2271167.html一、将输入信息转换为大写字符后再进行条件判断二、为调…

Keras卷积+池化层学习

转自&#xff1a;https://keras-cn.readthedocs.io/en/latest/layers/convolutional_layer/ https://keras-cn.readthedocs.io/en/latest/layers/pooling_layer/ 1.con1D keras.layers.convolutional.Conv1D(filters, kernel_size, strides1, paddingvalid, dilation_rate1, ac…