LinkedList实现基于LRU算法的缓存
2015-08-07 18:18
811 查看
学过操作系统的人都知道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()); } }
不要吐槽这个哈,时间关系,就直接这么演示了,你可以直接拷贝下来运行就可以了。希望可以帮到你!
相关文章推荐
- mysql5.5.27主从复制
- Sublime text 3快捷键壁纸版
- redis Transaction支持
- 在ubuntu 上创建 ssl 证书
- 模仿系统C键功能菜单
- 帝国建站系统中的模板导入和导出的问题
- Normalized Cut的C++代码 Linux Win
- Linux搭建ftp在windows下这么访问,需要怎么设置【设置vsftp最大连接数和每个ip的最大连接数】
- [IOS]今天开始学UI---UITextField&&UITextView
- 一月一城市,一年一大洲
- sql serve2008是否自带互斥锁
- solr +zookeeper+tomcat 集群搭建
- 2015多校 #5 1002 MZL's xor
- quick - cocos2d 遮罩 ClippingNode
- ant+svn+tomcat实现项目自动部署
- for 循环境实现游标LOOP提取
- virtualbox虚拟机中apache bug
- nginx静态资源下载,实现下载点击量、下载完成量统计
- 关于测试Windows电脑端口的命令 —— telnet用法
- redis 的消息发布订阅