LRU算法,最近最少使用原则,如果要实现该算法,可以借助LinkedHashMap数据结构,LinkedHashMap继承HashMap,底层使用哈希表和双向链表来保存所有元素,使用LinkedHashMap可以确保元素按照顺序进行存储。

默认情况下,LinkedHashMap是按照元素的添加顺序存储,也可以启用按照访问顺序存储,即最近读取的数据放在最前面,最早读取的数据放在最后面,然后它还有一个判断是否删除最老数据的方法,默认是返回false,即不删除数据。

下面就基于这两种存储方式,简单展示一下如何实现LRU算法:

一、基于按添加顺序存储的方式实现LRU:

public class LRUTest
{int capacity;LinkedHashMap<Integer, Integer> cache;LRUTest(int capacity){cache = new LinkedHashMap<>();this.capacity = capacity;}//访问元素public int get(int key){if(!cache.containsKey(key)){return -1;}//存在,先从链表头部删除删除,在插入到链表尾部int val = cache.get(key);cache.remove(key);cache.put(key, val);return val;}//添加元素public void put(int key, int val){if(cache.containsKey(key)){cache.remove(key);}//如果链表已经满了,则删除头部节点if(cache.size() == capacity){Set<Integer> keySet = cache.keySet();Iterator<Integer> iterator = keySet.iterator();cache.remove(iterator.next());}cache.put(key, val);}
}

二、基于按访问顺序存储的方式实现LRU:

该方式的核心就是继承LinkedHashMap,并设置LinkedHashMap的accessOrder参数为true,然后重写LinkedHashMap的removeEldestEntry()方法。

public class LRUTest extends LinkedHashMap<String, String>
{private int capacity;/*** 当LinkedHashMap的accessOrder参数为true时,即会按照访问顺序排序,最近访问的放在最前,最早访问的放在后面*/public LRUTest(int capacity) {super(16, 0.75f, true);this.capacity = capacity;}/*** LinkedHashMap自带的判断是否删除最老的元素方法,默认返回false,即不删除老数据*/@Overrideprotected boolean removeEldestEntry(Map.Entry<String, String> eldest){return size() > capacity;}
}

测试方法:

    public static void main(String[] args){Map<String, String> linkedHashMap = new LRUTest(6);linkedHashMap.put("1", "1");linkedHashMap.put("2", "2");linkedHashMap.put("3", "3");linkedHashMap.put("4", "4");linkedHashMap.put("5", "5");linkedHashMap.put("6", "6");linkedHashMap.put("7", "7");linkedHashMap.put("8", "8");linkedHashMap.put("9", "9");System.out.println("size="+linkedHashMap.size());System.out.println(linkedHashMap.get("8"));linkedHashMap.forEach((k,v) ->{System.out.print(k + ":"+ v +"  ");});System.out.println();System.out.println("size="+linkedHashMap.size());}

输出结果:

size=6
8
4:4  5:5  6:6  7:7  9:9  8:8
size=6

使用LinkedHashMap实现LRU算法相关推荐

  1. LinkedHashMap实现LRU算法

    LinkedHashMap 概述 笔者曾提到,HashMap 是 Java Collection Framework 的重要成员,也是Map族(如下图所示)中我们最为常用的一种.不过遗憾的是,Hash ...

  2. 利用LinkedHashMap实现LRU算法

    import java.util.LinkedHashMap; import java.util.Map; import java.util.Set;public class LruCache< ...

  3. linkedhashmap遍历_Java集合:浅谈LinkedHashMap、LinkedHashSet源码及LRU算法实现

    Java的HashSet.HashMap集合应用及底层原理,相信大家都已经很熟悉了,这里就不再赘述了.这里主要来介绍下如何Java中的LinkedHashMap集合,同时也介绍下基于LinkedHas ...

  4. java 最少使用(lru)置换算法_缓存置换算法 - LRU算法

    LRU算法 1 原理 对于在内存中并且不被使用的数据块就是LRU,这类数据需要从内存中删除,以腾出空间来存储常用的数据. LRU算法(Least Recently Used,最近最少使用),是内存管理 ...

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

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

  6. 01 guava-cache:LRU算法

    文章目录 LRU算法介绍 LRU算法实现 使用LinkedHashMap实现 LRU算法介绍 最近最久未使用(LRU)算法,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高&q ...

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

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

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

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

  9. LinkedHashMap实现LRU缓存算法

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

最新文章

  1. LeetCode 93. Restore IP Addresses--面试算法题--Python解法
  2. storm从入门到放弃(一),storm介绍
  3. python import gc_Python 2.6 GC似乎可以清理对象,但不会释放内存
  4. 【视频课】一课彻底掌握深度学习图像分类各种问题,学习CV你值得拥有
  5. js复制数据IE,FF..浏览器兼容
  6. 关于设计模式--我有话说
  7. html中写色块,CSS3 彩虹色块
  8. 21 WBS元素报错-会计科目xxxxxx不能使用(请更正)
  9. 基于SSLStrip的HTTPS会话劫持
  10. 13 Process Lifecycle: Process Creation and Termination
  11. 一行代码扫出“敬业福”
  12. 安装pyOpenGL/python-opengl
  13. 独家揭秘影响SEO排名的17项核心因素
  14. fastboot实战
  15. 物联网技术概论:第7章
  16. AngularJS中文入门教程
  17. 技术汇总:第七章:三种验证方式
  18. [bzoj3875][DP][最短路]骑士游戏
  19. 计算机专业欧美排名,数字媒体艺术大学排名TOP3世界榜一览!
  20. 奇点临近:互联网经济的供给侧革命和全球货币政策的新格林斯潘之谜

热门文章

  1. 六十七、完成Vue项目首页图标区域布局和逻辑实现
  2. 最后一篇,小白看的Python基础教程,详细得很(十一)
  3. pyqtgraph初探
  4. 算法工程师想拿百万高薪,5大维度评估竞争力,情商也很重要
  5. 再谈类别不平衡问题:调节权重与魔改Loss的综合分析
  6. 【CVPR2020 image caption】读Meshed-Memory Transformer for Image Captioning
  7. python print 输出到txt_Python的print()输出形式
  8. Docker操作容器2
  9. PaddleOCR——申请显存不足【Allocate too much memory for the GPU memory pool, assigned 8000 MB】解决方案
  10. 大学阶段总结——大二