七叶笔记 » Java » 每天一个面经系列--面经21:手写一个LRU算法

每天一个面经系列--面经21:手写一个LRU算法

面试官:手写一个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);

initialCapacity:初始容量

loadFactor:装载因子

accessOrder:访问顺序

false,所有的Entry按照插入的顺序排列true,所有的Entry按照访问的顺序排列

关于装载因子的为什么是0.75可以看这篇博客:https://blog.csdn.net/hcmony/article/details/56494527

还有各种使用LinkedHashMap来实现LRU算法的请看这篇博客:https://www.jianshu.com/p/93e545e877de

转自:https://blog.csdn.net/qq_32100465/article/details/90690640

相关文章