在最近的面试中,我曾被多次问到,怎么实现一个最近最少使用(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

LInkedHashMap实现最近被使用(LRU)缓存相关推荐

  1. LinkedHashMap实现LRU缓存算法

    缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的. LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉. 先说说List:每次访问一个 ...

  2. java mysql lru_Java集合详解5:深入理解LinkedHashMap和LRU缓存

    今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存. 摘要:HashMap和双向链表合二为一即是LinkedHashMap.所谓Linked ...

  3. Java集合详解5:深入理解LinkedHashMap和LRU缓存

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

  4. JDK1.8源码分析:LinkedHashMap与LRU缓存设计思路

    概述 LinkedHashMap继承于HashMap,在HashMap的基础上,新增了两个特性: 支持以节点的插入顺序来迭代该map内的所有节点: 支持缓存设计中LRU的特性,即LinkedHashM ...

  5. 常考数据结构和算法:设计LRU缓存结构

    题目描述 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的val ...

  6. 10 行 Java 代码实现 LRU 缓存

    10 行 Java 代码实现 LRU 缓存 (整理自网络) 最近最少使用缓存的回收 为了实现缓存回收,我们需要很容易做到: 查询出最近最晚使用的项 给最近最少使用的项做一个标记 链表可以实现这两个操作 ...

  7. LRU缓存实现(Java)

    LRU是Least Recently Used 的缩写,翻译过来就是"最近最少使用",LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的 ...

  8. 06 | 链表(上):如何实现LRU缓存淘汰算法?

    缓存 作用 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存.数据库缓存.浏览器缓存等等. 淘汰策略 常见的策略有三种:先进先出策略 FIFO(F ...

  9. 实现 LRU 缓存算法

    1 LRU 缓存介绍 LRU 算法全称是最近最少使用算法(Least Recently Use),是一种简单的缓存策略.顾名思义,LRU 算法会选出最近最少使用的数据进行淘汰. 那么什么是缓存呢?缓存 ...

  10. LRU 缓存机制实现:哈希表 + 双向链表

    算法详解 LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对. 双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的 ...

最新文章

  1. ReentrantLock中的Condition(等待和唤醒)
  2. json字符串拼接 json_encode 数组带有花括号{}和中括号[]
  3. php 实现对称加密算法,PHP实现简单的对称加密和解密方法
  4. Jenkins详细安装与构建部署使用教程(转)
  5. “奶茶第一股”香飘飘,“香”不起来了?
  6. 第四十四章 微服务CICD(6)- gitlab + jenkins + docker + k8s
  7. VTK:可视化算法之DecimateHawaii
  8. pandas的dataframe节省内存
  9. 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
  10. [渝粤教育] 三江学院 大学生创新基础课程 参考 资料
  11. 开源开放 | 开源网络通信行业知识图谱(新华三)
  12. linux学习查看日志命令
  13. 编程猫海龟编辑器python_海龟编辑器下载
  14. 天津铁路警方打击倒票专项行动破案19起 抓获19人
  15. win7 下安装python用的dlib库
  16. 进制转换(二进制、八进制、十进制、十六进制)涵盖整数与小数部分,超详细
  17. 内存带宽stream测试
  18. 用VBA打开PDF文件
  19. java excel导入jsp_导入导出EXCEL数据(jsp+ssh)
  20. 时间序列进行分析的一些手法以及代码实现(移动平均、指数平滑、SARIMA模型、时间序列的(非)线性模型)

热门文章

  1. Lync与Exchange 2013 UM集成:Exchange 配置
  2. 通过shell将*.txt文本内容批量录入mysql
  3. Cornell University Designing with Microcontrollers
  4. 【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用
  5. 区块链简史:解读这场技术革命的前世今生
  6. 测试驱动开发 测试前移_测试驱动开发简介
  7. Android开发中应避免的重大错误
  8. 从零学web前端_从零到前端英雄(第2部分)
  9. rhel-server-7.5-x86_64-dvd.iso镜像下载及rar压缩包的解压
  10. oracle的表几种连接比较,几种表连接方式的使用场景