JAVA实现LRU算法的参考示例
作者:追极 发布时间:2022-01-26 21:56:49
标签:Java,LRU,算法
LRU简介
LRU是Least Recently Used 近期最少使用算法,它就可以将长时间没有被利用的数据进行删除。
实现
最近面了阿里的外包吧,居然也要在线敲代码了,那叫一个紧张啊。题目就是实现一个LRU算法的缓存。外包居然要求也这么高了,哎。还好,LRU是我大学老师布置的一道题目,当然我用C语言实现的,算法原理那是一清二楚,可是面试的时候就脑子一片空白了。好在,边敲代码,边思考,就慢慢想起来了,下面是我的代码。仅供参考
/**
* 设计和构建一个“最近最少使用”LRU 缓存,该缓存会删除最近最少使用的项目。
* 缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。
* 当缓存被填满时,它应该删除最近最少使用的项目。
* 考虑多线程操作下的操作安全和性能。
*/
public class LRUCache{
private int maxSize;
/**
* 存储缓存数据
*/
private ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<>();
/**
**存储缓存key列表
*/
private LinkedList<String> list;
LRUCache(){
}
LRUCache(int maxSize){
this.maxSize = maxSize;
this.list = new LinkedList<>(maxSize);
}
/**
* @param key 缓存key
@return 缓存值
*/
synchronized Object getVal(String key){
//1.从map里取数据
Object obj = map.get(key);
//2.将key置于list的尾部(表示最近被访问过了)
if(obj != null){
addOrRefreshKey(key);
}
}
synchronized void putVal(String key,Object val){
//1.设置val到map中
//2.将key置于list的尾部(表示最近被访问过了)
//3.需要做判断是否list.size()>maxSize。如果满了就删除头部(最近最少使用)的数据后再执行1-2步骤
}
/**
* 添加或刷新key
*/
private void addOrRefreshKey(String key){
this.list.remove(key); //管他三七二十一,先删除掉
this.list.add(key); //然后添加这个可以,保证key置于list的尾部
}
}
来源:https://www.cnblogs.com/hdwang/archive/2020/10/29/13898966.html


猜你喜欢
- 简介虽然java有自动化的GC,但是还会有内存泄露的情况。当然java中的内存泄露跟C++中的泄露不同。在C++中所有被分配的内存对象都需要
- 在进行需求开发的时候,我们总是避不开和用户的数据打交道,那提到获取用户的数据一定会想到的东西就是申请权限<uses-permissio
- 在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一
- Java synchronized 关键字 可以将一个代码块或一个方法标记为同步代码块。同步代码块是指同一时间只能有一个线程执行的代码,并且
- JAVA中Integer类下的常用方法有哪些?1.进制转换 n进制转10进制 字符串结果Integer.parseInt(String s,
- Java排序 - DualPivotQuicksort这里描述 leftmost = true 的情况,也就是会从数组的开始一直排序到数组的
- 光流的概念是由一个叫Gibson的哥们在1950年提出来的。它描述是空间运动物体在观察成像平面上的像素运动的瞬时速度,利用图像序列中像素在时
- 原因用Java调用雪球的API,结果返回的是乱码,一番研究后发现是因为返回的数据使用了GZIP压缩,需要先解压才能得到正确数据。思路使用了G
- 本文实例讲述了Java基本数据类型与类型转换。分享给大家供大家参考,具体如下:相关内容:基本数据类型整型浮点型字符型布尔型数据类型转换数组首
- 在后台工程师开发完新代码交给QA进行测试时,软件测试人员一般都会要求后台开发对单元测试的覆盖率达到一定的标准;例如我们的标准是分支覆盖率达到
- 引言青蛙见了蜈蚣,好奇地问:"蜈蚣大哥,我很好奇,你那么多条腿,走路的时候先迈哪一条啊?"蜈蚣听后说:"青蛙老
- 避免"索引越界"错误的规则如下(针对C++):不要使用静态或动态分配的数组,改用array或vector模板不要使用带方
- Spring多配置文件有什么好处? 按照目的、功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理、数据源等少改动的配置与
- 之前写过一篇获取properties文件里面的值:Springboot 指定获取自己写的配置properties文件的值www.jb51.n
- 一、百度百科Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防
- 概述Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,
- try { using (TransactionScope tr = new Transact
- 传统的Trie实现简单,但是占用的空间实在是难以接受,特别是当字符集不仅限于英文26个字符的时候, * 起来的空间根本无法接受。双数组Trie
- 一、简介在上篇 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的各种 api 使用。实际的项目开发过程中
- 目录引言什么是Span关于String的一段性能提升测试代码最终性能对比写在最后引言C# 是一门现代化的编程语言,与Java十分的相似。熟练