Java實現一個LRU Cache本地緩存

前兩天網易面試被問到的問題, 當時我根本不知道什麼是LRU…很尷尬

LRU Cache = Least Recently Uesd Cache

就是: 最近 最少使用的緩存;

當時在面試官的提示下我第一個想到的是HashMap, 要做線程安全可以用ConcurrentHashMap
然後面試官提示緩存不能無限大, 所以我限定了HashMap的容量, 但是因爲不理解LRU的概念, 所以答得很慘烈…

這個題目很典型, 出自Leetcode: 146. LRU緩存機制 題目鏈接

題目描述如下:
在這裏插入圖片描述

這一題我的第一反應是, LRU可能應該用一個HashMap配合一個Queue來做, 因爲它要做一個類似於先進先出的模式呀, 最早使用的在前面, 要先出去, 但是很容易要出現的情況是, 一個原本在隊列中間的元素, 現在要使用了, 就很難從隊列裏取出來;

所以這題的正解是 使用HashMap加鏈表來做, 在HashMap裏, 存一個key-value的結構, 然後value裏面就存鏈表每個節點的引用, 限定Map和鏈表的長度, 保證不會超過Capacity;

在這裏插入圖片描述
圖解如上;

實現代碼如下:

public class LRUCache {
    private Map<Integer, Integer> cache;

    public LRUCache(int capacity) {
        this.cache = new LinkedHashMap<Integer, Integer>(capacity, 0.75f, true){
            @Override
            protected boolean removeEldestEntry(Map.Entry eldest) {
                return capacity < cache.size();
            }
        };
    }

    public int get(int key) {
        return cache.getOrDefault(key, -1);
    }

    public void put(int key, int value) {
        cache.put(key, value);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章