1、介绍
LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”。
缓存有一定的大小限制,当没有满时,可以向缓存中添加;当满时,LRU缓存把最近最少使用的数据移除,让给最新读取的数据;
而往往最常读取的,也是读取次数最多的,所以,利用LRU缓存,我们能够提高系统的performance。
2、LRU cache的实现
按照访问顺序维护缓存中数据,当访问一个时,则需要改变该数据的顺序;当添加一个新的数据时,则顺序添加即可;当缓存满时,则删除访问顺序中的最后一个;
2.1 LinkedHashMap的实现
1)元素的组织:
LinkedHashMap实现了顺序存储,默认情况下是按照元素的添加顺序存储(最新添加的在最前面),也可以启用按照访问顺序存储(即最近读取的数据放在最前面,最早读取的数据放在最后面);
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder)
构造一个带指定初始容量、加载因子和排序模式的空 LinkedHashMap 实例。
参数:
initialCapacity - 初始容量
loadFactor - 加载因子
accessOrder - 排序模式 - 对于访问顺序,为 true;对于插入顺序,则为 false
2)元素的访问:
需要快速访问;LinkedHashMap有hashMap的性质,可以实现o(1)访问;
3)缓存大小的限制;
4)缓存中移除最近最少使用:
LinkedHashMap有一个判断是否删除最老数据的方法,默认是返回false,即不删除数据;我们需要对该方法进行重写;
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
如果此映射移除其最旧的条目,则返回 true。在将新条目插入到映射后, put 和 putAll 将调用此方法。此方法可以提供在每次添加新条目时移除最旧条目的实现程序。如果映射表示缓存,则此方法非常有用:它允许映射通过删除旧条目来减少内存损耗。
实现方法1(继承LinkedHashMap):
package cn.lzrabbit.structure.lru;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Created by liuzhao on 14-5-15.
*/
public class LRUCache2<K, V> extends LinkedHashMap<K, V> {
private