LinkedList实现基于LRU算法的缓存
学过操作系统的人都知道LRU页面切换算法,其实这个算法不仅仅只是能在页面切换中应用到,在缓存中也有很实际的应用。最典型的实现方式是采用LinkedHashMap来实现这个缓存,大家可以在Java源码里面看到这个类的作者关于这个的描述,不过全是英文,但是却明确提到过。
下面废话不多说,直接展示我自己关于这个算法实现的代码吧,亲测通过:
核心算法代码:
package hk.inso.www.cache; import java.util.Hashtable;
import java.util.LinkedList; /**
* Created by IntelliJ IDEA.
* Date: 8/7/15 4:46 PM
* Author: Richard
*/
public class LinkedListCache<Object>{ //默认的缓存大小
private static int CAPACITY = 0; //引用一个双向链接表
private LinkedList<Object> list; //构造函数
public LinkedListCache(int capacity) {
this.CAPACITY = capacity;
list = new LinkedList<Object>();
} //添加一个元素
public synchronized void put(Object object) { if(list != null && list.contains(object)) {
list.remove(object);
}
removeLeastVisitElement();
list.addFirst(object);
} //移除最近访问次数最少的元素
private synchronized void removeLeastVisitElement() { int size = size(); //注意,这儿必须得是CAPACITY - 1否则所获的size比原来大1
if(size > (CAPACITY - 1) ) {
Object object = list.removeLast();
System.out.println("本次被踢掉的元素是:" + object.toString());
}
} //获取第N个索引下面的元素
public synchronized Object get(int index) {
return list.get(index);
} //清空缓存
public synchronized void clear() {
list.clear();
} //获取链接表的大小
public int size() {
if(list == null) {
return 0;
}
return list.size();
} //toString方法
public String toString() {
return list.toString();
} }
测试代码:
package hk.inso.www.test; import hk.inso.www.cache.LRUCache;
import hk.inso.www.cache.LinkedListCache;
import hk.inso.www.cache.MapCache; import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; /**
* Created by Richard on 8/5/15.
*/
public class CacheTest { public static void main(String[] args) throws InterruptedException { LinkedListCache linkedListCache = new LinkedListCache<String>(5); linkedListCache.put("1");
System.out.println(linkedListCache.toString());
Thread.sleep(1000);
linkedListCache.put("2");
System.out.println(linkedListCache.toString());
Thread.sleep(1000);
linkedListCache.put("3");
System.out.println(linkedListCache.toString());
Thread.sleep(1000);
linkedListCache.put("4");
System.out.println(linkedListCache.toString());
Thread.sleep(1000);
linkedListCache.put("5");
System.out.println(linkedListCache.toString());
Thread.sleep(1000);
linkedListCache.put("1");
System.out.println(linkedListCache.toString());
Thread.sleep(1000);
linkedListCache.put("6");
System.out.println(linkedListCache.toString());
Thread.sleep(1000);
linkedListCache.put("4");
System.out.println(linkedListCache.toString());
Thread.sleep(1000);
linkedListCache.put("7");
System.out.println(linkedListCache.toString());
}
}
不要吐槽这个哈,时间关系,就直接这么演示了,你可以直接拷贝下来运行就可以了。希望可以帮到你!
LinkedList实现基于LRU算法的缓存的更多相关文章
- 借助LinkedHashMap实现基于LRU算法缓存
一.LRU算法介绍 LRU(Least Recently Used)最近最少使用算法,是用在操作系统中的页面置换算法,因为内存空间是有限的,不可能把所有东西都放进来,所以就必须要有所取舍,我们应该把什 ...
- GuavaCache学习笔记一:自定义LRU算法的缓存实现
前言 今天在看GuavaCache缓存相关的源码,这里想到先自己手动实现一个LRU算法.于是乎便想到LinkedHashMap和LinkedList+HashMap, 这里仅仅是作为简单的复习一下. ...
- 简单LRU算法实现缓存
最简单的LRU算法实现,就是利用jdk的LinkedHashMap,覆写其中的removeEldestEntry(Map.Entry)方法即可,如下所示: java 代码 import java.ut ...
- LinkedHashMap 和 LRU算法实现
个人觉得LinkedHashMap 存在的意义就是为了实现 LRU 算法. public class LinkedHashMap<K,V> extends HashMap<K,V&g ...
- Guava---缓存之LRU算法
随笔 - 169 文章 - 0 评论 - 292 GuavaCache学习笔记一:自定义LRU算法的缓存实现 前言 今天在看GuavaCache缓存相关的源码,这里想到先自己手动实现一个LRU ...
- 缓存---LRU算法实现
2.LRU 以下是基于双向链表+HashMap的LRU算法实现,对算法的解释如下: 设置一个map存放对应的键和值,同时设置一个双向链表,来保存最近最久未使用的关系,如果访问一个键,键存在于m ...
- Android图片缓存之Lru算法
前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...
- 缓存淘汰算法--LRU算法
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...
- LRU算法 缓存淘汰策略
四种实现方式 LRU 1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也 ...
随机推荐
- Windows下Yarn安装与使用
参考博客 1.安装yarn 方法一:使用安装包安装 官方下载安装包,https://yarnpkg.com/zh-Hans/docs/install,安装完毕后,一定要配置环境变量. 方法二:使用np ...
- 2018-2019-2 20165215《网络对抗技术》Exp10 Final Windows本地内核提权+Exploit-Exercises Nebula学习与实践
目录 PART ONE :Windows本地内核提权 漏洞概述 漏洞原理 漏洞复现 windbg调试本地内核 查看SSDT表和SSDTShadow表 查看窗口站结构体信息 利用Poc验证漏洞 漏洞利用 ...
- Java Jsch SFTP 递归下载文件夹
Java Program For Downloading Folder Content recursively from SFTP Server How to download folder from ...
- AttributeError:module 'keras.engine.topology' has no attribute 'load_weights_from_hdf5_group_by_name
在jupyter notebooks上运行tensorflow-keras的Mask R-CNN时遇到如下错误: 参考博客中写了两种解决方案: 解决方案一:报错是由于keras版本不对造成的.load ...
- leetcode1281 整数的各位积和之差
class Solution { public: int subtractProductAndSum(int n) { ; ; ){ ; n/=; prod*=r; add+=r; } int res ...
- Json文件删除元素
方法1:delete 注意,该方法删除之后的元素会变为null,并非真正的删除!!! 举例: 原json: { "front" : { "image" : [ ...
- win10搜索框突然不能使用了
备忘: win10搜索不出来了,使用以下方法恢复了,备忘下 1,首先打开任务管理器 重新启动wservice服务 2.发现这时候搜索依然不能使用 然后重新启动explorer.exe (1)右键关闭该 ...
- Script Form商业报表程序设计
Script Form 是SAP所提供的一款强大的报表设设计工具. 一.Script Form主要工具包括如下: 1)Form Painter:格式绘制器,用于格式的设定.TCoce:SE71. 2) ...
- SQL中group by使用
多条重复记录,有一个字段可以进行区分,从重复的记录中取出其中一条,可利用group by字段 举例如下: 查询所有 查询地区中的最高分
- JavaScript(1):Base/Tips
目录 输出 全局变量 字符串 类型及转换 变量提升 严格模式 表单验证 (1) 输出 <!DOCTYPE html> <html> <body> <p> ...