博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LinkedList实现基于LRU算法的缓存
阅读量:5288 次
发布时间:2019-06-14

本文共 3196 字,大约阅读时间需要 10 分钟。

 

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{    //默认的缓存大小    private static int CAPACITY = 0;    //引用一个双向链接表    private LinkedList list;    //构造函数    public LinkedListCache(int capacity) {        this.CAPACITY = capacity;        list = new LinkedList();    }    //添加一个元素    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
(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()); }}

 

不要吐槽这个哈,时间关系,就直接这么演示了,你可以直接拷贝下来运行就可以了。希望可以帮到你!

转载于:https://www.cnblogs.com/think90/p/11443367.html

你可能感兴趣的文章
动态对象(dynamic)的用法
查看>>
第九周软件工程作业-每周例行报告
查看>>
linux常用命令二
查看>>
angularJS全选功能实现
查看>>
礼物 HYSBZ - 4827 (fft + 构造 )
查看>>
ASP.NET MVC5 Authentication Filters执行链
查看>>
基于谱减法的声音去噪
查看>>
leetcode python 008
查看>>
SQL Server字符串左匹配
查看>>
docker从零开始网络(四 ) host网络
查看>>
Spring框架+Struts2框架第一次整合
查看>>
Django之ORM操作(聚合 分组、F Q)
查看>>
RabbitMQ系列之Centos 7安装RabbitMQ 3.6.1
查看>>
如何实现自定义同步组件
查看>>
用html5+flash两种方案实现前端长文转图
查看>>
测试记录
查看>>
codeforces 580D. Kefa and Dishes
查看>>
Java 中使用MySQL
查看>>
解决使用SecureCRT出现的Generic clipboard failure错误
查看>>
POJ 1816
查看>>