基于LinkedHashMap手寫LRU淘汰策略

上一篇 <<<JDK8的HashMap中紅黑樹左旋右旋原理圖解
下一篇 >>>HashSet集合底層實現(xiàn)原理


LRU(最近最少使用)緩存淘汰算法一般用于緩存場景,當緩存滿的時候,把最少使用的數(shù)據(jù)清掉。

方案1:當key使用的時候,count值+1,最后遍歷key的count值,把最小的key清理出去。缺點是數(shù)據(jù)量大時遍歷效率低
方案2:基于LinkedHashMap有序集合實現(xiàn)
原理:訪問key的時候,就會將該key存放到鏈表最后的位置,鏈表最開頭位置說明最近最少使用的

public class ManualLruAlgorithm<K, V> extends LinkedHashMap<K, V> {
    /**
     * 容量
     */
    private int capacity;

    public ManualLruAlgorithm(int capacity) {
        // 末尾accessOrder設置為true,表示訪問順序,當有訪問時,key被挪到末尾,最前面是最少使用的數(shù)據(jù)
        super(capacity, 0.75f, true);
        this.capacity = capacity;
    }

    /**
     * 列表大小大于容量時,清理頭結點
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > capacity;
    }

    public static void main(String[] args) {
        ManualLruAlgorithm<String, String> lruCache = new ManualLruAlgorithm<>(3);
        lruCache.put("a","a");
        lruCache.put("b","b");
        lruCache.put("c","c");
        lruCache.put("d","d");
        // 打印結果:bcd,a已被淘汰
        lruCache.forEach((k, v) -> {
            System.out.print(k );
        });
        System.out.println();
        lruCache.put("c","e");
        // 打印結果:bdc,c已被挪到末尾
        lruCache.forEach((k, v) -> {
            System.out.print(k );
        });
    }
}

相關文章鏈接:
<<<Java集合類圖總覽
<<<ArrayList的添加和刪除操作實現(xiàn)原理圖解
<<<ArrayList的動態(tài)擴容、ModCount及fail-fast原理
<<<LinkedList增刪改查操作底層實現(xiàn)原理
<<<數(shù)組拷貝的幾種方式及和鏈表結構的對比
<<<Jdk1.7HashMap源碼分析
<<<Jdk1.7HashMap如何擴容及解決死循環(huán)問題
<<<JDK1.8HashMap源碼分析
<<<ConcurrentHashMap在JDK1.8版本比1.7改進了什么
<<<JDK8的HashMap中紅黑樹左旋右旋原理圖解
<<<HashSet集合底層實現(xiàn)原理
<<<HashTable底層實現(xiàn)原理及和ConcurrentHashMap區(qū)別
<<<java集合常見面試題

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容