中心思想:用链表实现,最近最少使用的拍在链表头,最近最多使用的排在队尾。
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 继承LinkedHashMap类实现LRU算法
*
* 1.重写removeEldestEntry方法,当这个方法返回true是,会删除链表头
*
* @author dengdongdong
* @date 2020/5/6
*/
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
/**
* 容量
*/
private int capacity;
public LRUCache(int initialCapacity, float loadFactor, boolean accessOrder) {
super(initialCapacity, loadFactor, accessOrder);
this.capacity = initialCapacity;
}
/**
* 如果素数数量大于容量的话,返回true。
*
* @param eldest
* @return
*/
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return super.size() > capacity;
}
public static void main(String[] args) {
// 默认的顺序是按照插入顺序排序,现在我指定了按照访问顺序排序,最近被访问过的拍在队尾
LRUCache<Integer, Integer> lruCache = new LRUCache<Integer, Integer>(3, 0.75f, true);
lruCache.put(1, 1);
lruCache.put(2, 2);
lruCache.put(3, 3);
lruCache.put(4, 4);
lruCache.put(5, 5);
// 初始化后链表的顺序如下
for (Map.Entry<Integer, Integer> v : lruCache.entrySet()) {
System.out.println(v.getValue());
}
System.out.println("访问后的顺序如下:");
lruCache.get(3);
lruCache.put(8, 8);
for (Map.Entry<Integer, Integer> v : lruCache.entrySet()) {
System.out.println(v.getValue());
}
}
}
注意点:
1.初始化的时候指定按照访问顺序排序
2.默认情况下不会删除链表头元素,所以需要重写removeEldestEntry
这个方法,当元素数量达到最大容量时,删除链表头元素。