什么是LRU
LRU
是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法。
在一般标准的操作系统教材里,会用下面的方式来演示 LRU 原理,假设内存只能容纳3个页大小,按照 7 0 1 2 0 3 0 4 的次序访问页。假设内存按照栈的方式来描述访问时间,在上面的,是最近访问的,在下面的是,最远时间访问的,LRU就是这样工作的。
那么Java中如何实现一个LRU算法呢。
LinkedHashMap
LinkedHashMap是维护了双向链表的HashMap,保持了插入元素的顺序。
LinkedHashMap提供了一个钩子方法,在新插入元素后可以决定是否删除最老的元素。
/**
* LRU中最大元素数量
*/
private int maxSize;
public LRUByLinkedHashMap(int maxSize) {
// 容量为最大值/0.75,即最大负载容量为maxSize
// accessOrder=true 根据查询排序,即最近被使用的放到后面
super((int) Math.ceil(maxSize / 0.75) + 1, 0.75f, true);
this.maxSize = maxSize;
}
/**
* 此方法为钩子方法,map插入元素时会调用此方法
* 此方法返回true则证明删除最老的因子
*
* @param eldest
* @return
*/
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > maxSize;
}