面试官:手写一个LRU算法我看看。
答:不求自己纯手工从底层开始打造自己得LRU,但是起码要知道如何利用已有得JDK数据结构实现一个Java版的LRU。
思想:使用LinkedHashMap,一个有序的HashMap。
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int CACHE_SIZE;
/**
* 传递进来最多能缓存多少数据
* @param cacheSize 缓存大小
*/
public LRUCache(int cacheSize) {
//true 表示让 linkedHashMap 按照访问顺序来进行排序,最近访问的放在头部,最老访问的的放在尾部
super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
CACHE_SIZE = cacheSize;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
//当map中的数据量大于制定的缓存个数的时候,就自动删除最老的数据
return size() > CACHE_SIZE;
}
}
super()表示父类的构造方法:
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder);