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,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也 ...
随机推荐
- java基础阶段几个必会面试题
摘自:https://www.cnblogs.com/zn19961006/p/11869182.html java基础阶段几个必会面试题 目录 1.说出你对面向对象的理解 在我理解,面向对象是向现实 ...
- 移动端的头部标签和 meta
使用 HTML5 doctype,不区分大小写 <!DOCTYPE html> 更加标准的 lang 属性写法 http://zhi.hu/XyIa <html lang=" ...
- 软工第04组 Alpha冲刺(1/6)
队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 过去一段时间对项目的精度和分工进行了更加细致的划分,并初步进行了GamePlay逻辑部分的框架设计 GitHub签入记录: ...
- 【.net core 0基础】创建你的第一个.net core应用
1.下载.NET core相应的SDK,https://dotnet.microsoft.com/download 2.安装完成后,打开命令提示符,输入命令 dotnet,检查是否正确安装,如果命令能 ...
- PS技巧集合
一.把图片变模糊 图像——调整——色阶——输出色阶——滤镜——模糊——高斯模糊——半径 二.图片换色 点击右下角弹层下方的“fx”——颜色叠加——色样颜色
- go使用go-redis操作redis 连接类型,pipline, 发布订阅
内容: 一 . 客户端Client(普通模式,主从模式,哨兵模式)二. conn连接(连接, pipline, 发布订阅等)三. 示例程序(连接, pipline, 发布订阅等)客户端Client 普 ...
- 已经配置好了的 jmeter + ant 框架
已经配置好了的 jmeter + ant 框架 ,需要自取,避免查找安装攻略时耗费时间 使用前需配置环境变量,阅读文件内安装文档!!! 链接:https://pan.baidu.com/s/1eRz9 ...
- 【HANA系列】SAP HANA SQL计算两个日期的差值
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL计算两个 ...
- gulp4.0配置
var gulp = require('gulp'); var rename = require('gulp-rename');//重命名 var uglify=require('gulp-uglif ...
- android webview 访问 https 页面
在android 中利用webview 控件进行开发过程中,可能会遇到 webview 访问不了https://的页面如 https://www.google.com.hk 重写onReceivedS ...