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

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

阿里巴巴笔试考到了LRU,一激动忘了怎么回事了。。准备不充分啊。。

缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每次访问一个元素后把这个元素放在 List一端,这样一来最远使用的元素自然就被放到List的另一端。缓存满了t的时候就把那最远使用的元素remove掉。但更实用的是HashMap。因为List太慢,要删掉的数据总是位于List底层数组的第一个位置,删掉之后,后面的数据要向前补位。。所以复杂度是O(n),那就用链表结构的LinkedHashMap呗~,LinkedHashMap默认的元素顺序是put的顺序,但是如果使用带参数的构造函数,那么LinkedHashMap会根据访问顺序来调整内部 顺序。 LinkedHashMap的get()方法除了返回元素之外还可以把被访问的元素放到链表的底端,这样一来每次顶端的元素就是remove的元素。

构造函数如下:

public LinkedHashMap (int initialCapacity, float loadFactor, boolean accessOrder);

 initialCapacity   初始容量

 loadFactor    加载因子,一般是 0.75f

accessOrder   false 基于插入顺序  true  基于访问顺序(get一个元素后,这个元素被加到最后,使用了LRU  最近最少被使用的调度算法)

来个例子吧:
import java.util.*;class Test{	public static void main(String[] args) throws Exception{			Map
map=new LinkedHashMap<>(10,0.75f,true); map.put(9,3); map.put(7,4); map.put(5,9); map.put(3,4); //现在遍历的话顺序肯定是9,7,5,3 //下面访问了一下9,3这个键值对,输出顺序就变喽~ map.get(9); for(Iterator
> it=map.entrySet().iterator();it.hasNext();){ System.out.println(it.next().getKey()); } }}
输出
7
5
3
9
好玩吧~
下面开始实现LRU缓存喽~
import java.util.*;//扩展一下LinkedHashMap这个类,让他实现LRU算法class LRULinkedHashMap
extends LinkedHashMap
{ //定义缓存的容量 private int capacity; private static final long serialVersionUID = 1L; //带参数的构造器 LRULinkedHashMap(int capacity){ //调用LinkedHashMap的构造器,传入以下参数 super(16,0.75f,true); //传入指定的缓存最大容量 this.capacity=capacity; } //实现LRU的关键方法,如果map里面的元素个数大于了缓存最大容量,则删除链表的顶端元素 @Override public boolean removeEldestEntry(Map.Entry
eldest){ System.out.println(eldest.getKey() + "=" + eldest.getValue()); return size()>capacity; } }//测试类class Test{public static void main(String[] args) throws Exception{ //指定缓存最大容量为4 Map
map=new LRULinkedHashMap<>(4); map.put(9,3); map.put(7,4); map.put(5,9); map.put(3,4); map.put(6,6); //总共put了5个元素,超过了指定的缓存最大容量 //遍历结果 for(Iterator
> it=map.entrySet().iterator();it.hasNext();){ System.out.println(it.next().getKey()); } }}
输出结果如下
9=3
9=3
9=3
9=3
9=3
7
5
3
6
分析一下:使用带参数构造器,且启用LRU模式的LinkedHashMap会在每次有新元素加入的时候,判断当前储存元素是否超过了缓存上限,也就是执行
一次removeEldestEntry方法,看最后的遍历结果,发现果然把9删除了,LRU发挥作用了~

 

 

转载地址:http://guhal.baihongyu.com/

你可能感兴趣的文章
Nginx反向代理+Tomcat+Springmvc获取用户访问ip
查看>>
Android使用Fragment打造万能页面切换框架
查看>>
kafka分布式搭建
查看>>
hog
查看>>
Codeforces 833D Red-black Cobweb【树分治】
查看>>
nginx的日志分析
查看>>
ListView原理
查看>>
python--------------内置函数
查看>>
Scapy基础学习之中的一个
查看>>
http请求头详解
查看>>
SVNserver搭建
查看>>
Java基础(九):抽象类
查看>>
Unix:关于一个file在file system和disk中占用空间
查看>>
duilib 的IE浏览器控件去边框和去滚动栏的代码
查看>>
.NET平台微服务项目汇集
查看>>
线段树
查看>>
[CSS] Build a Fluid Loading Animation in CSS
查看>>
UWP开发入门(八)——聊天窗口和ItemTemplateSelector
查看>>
Java线程之Callable和Future
查看>>
多线程的实现及常用方法_DAY23
查看>>