亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于LinkedHashMap實現(xiàn)LRU緩存

 更新時間:2023年05月05日 11:57:45   作者:JAVA旭陽  
LinkedHashMap是Java集合中一個常用的容器,它繼承了HashMap, 是一個有序的Hash表。那么該如何基于LinkedHashMap實現(xiàn)一個LRU緩存呢?本文將介紹LinkedHashMap的實現(xiàn)原理,感興趣的同學(xué)可以參考一下

概述

LinkedHashMap是Java集合中一個常用的容器,它繼承了HashMap, 是一個有序的Hash表。那么該如何基于LinkedHashMap實現(xiàn)一個LRU緩存呢?這也是面試經(jīng)常被問到的題目,主要是考察你對Java集合容器的了解程度以及LinkedHashMap的實現(xiàn)原理。

分析

什么是LRU?

LRU(Least Recently Used)指的是最近最少使用,是一種緩存淘汰算法,淘汰掉那個最少使用的的數(shù)據(jù)。

  • LinkedHashMap是有序的,它默認(rèn)通過雙向鏈表維護(hù)元素的插入順序,同時,通過構(gòu)造函數(shù)設(shè)置accessOrder屬性為true的情況,維護(hù)元素的訪問順序,這里的訪問包括插入、修改、查詢等元素,每次操作都會記錄順序,所以LRU緩存其實是包括訪問的,所以我們需要通過構(gòu)造函數(shù)設(shè)置LinkedHashMap設(shè)置accessOrder為true。
  • 已經(jīng)解決了順序的問題,也就是最近訪問的會在雙向鏈表的尾部,最老的數(shù)據(jù)會在頭部。那么如何刪除頭部的元素呢?其實LinkedHashMap也提供了一個回調(diào)函數(shù)removeEldestEntry,它也會在添加元素的時候調(diào)用, 默認(rèn)返回false,我們可以通過重寫這個方法的邏輯,如果LinkedHashMap大于緩存指定數(shù)量,就進(jìn)行淘汰。

LRU緩存實現(xiàn)

場景:我們需要設(shè)計一個緩存最多只能存儲10個元素,當(dāng)元素個數(shù)超過10的時候,刪除(淘汰)那些最近最少使用的數(shù)據(jù),僅保存熱點數(shù)據(jù)。

public class LRUCache<K, V> extends LinkedHashMap<K, V> {

    /**
     * 緩存允許的最大容量
     */
    private final int maxSize;

    public LRUCache(int initialCapacity, int maxSize) {
        // accessOrder必須為true
        super(initialCapacity, 0.75f, true);
        this.maxSize = maxSize;
    }

    // 重寫
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        // 當(dāng)鍵值對個數(shù)超過最大容量時,返回true,觸發(fā)刪除操作
        return size() > maxSize;
    }

    public static void main(String[] args) {
        LRUCache<String, String> cache = new LRUCache<>(5, 5);
        cache.put("1", "1");
        cache.put("2", "2");
        cache.put("3", "3");
        cache.put("4", "4");
        // 做一次查詢
        cache.get("1");
        cache.put("5", "5");
        cache.put("6", "6");
        cache.put("7", "7");
        System.out.println(cache);
    }

}

運(yùn)行結(jié)果:

{4=4, 1=1, 5=5, 6=6, 7=7}

因為做了一次cache.get("1"),相當(dāng)于操作了1這個元素,變"新"了,所以只能淘汰3, 4。

總結(jié)

通過本文想必大家對LinkedHashMap有了更深的了解,可以用它來實現(xiàn)一個LRU緩存,實際上,通過LinkedHashMap實現(xiàn)LRU還是挺常見的,比如logback框架的LRUMessageCache。

到此這篇關(guān)于基于LinkedHashMap實現(xiàn)LRU緩存的文章就介紹到這了,更多相關(guān)LinkedHashMap實現(xiàn)LRU緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot啟動過程(五)之Springboot內(nèi)嵌Tomcat對象的start教程詳解

    Spring Boot啟動過程(五)之Springboot內(nèi)嵌Tomcat對象的start教程詳解

    這篇文章主要介紹了Spring Boot啟動過程(五)之Springboot內(nèi)嵌Tomcat對象的start的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 使用springMVC通過Filter實現(xiàn)防止xss注入

    使用springMVC通過Filter實現(xiàn)防止xss注入

    這篇文章主要介紹了使用springMVC通過Filter實現(xiàn)防止xss注入的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 深入了解Java核心類庫--Date,Calendar,DateFormat類

    深入了解Java核心類庫--Date,Calendar,DateFormat類

    這篇文章主要為大家詳細(xì)介紹了javaDate,Calendar,DateFormat類定義與使用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-07-07
  • java中Memcached的使用實例(包括與Spring整合)

    java中Memcached的使用實例(包括與Spring整合)

    這篇文章主要介紹了java中Memcached的使用實例(包括與Spring整合),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • idea連接數(shù)據(jù)庫的操作方法

    idea連接數(shù)據(jù)庫的操作方法

    這篇文章主要介紹了idea如何連接數(shù)據(jù)庫,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Java中Calendar類用法實例詳解

    Java中Calendar類用法實例詳解

    這篇文章主要給大家介紹了關(guān)于Java中Calendar類用法的相關(guān)資料,Calendar類是Java.util包中提供的一個抽象類,該類從JDK1.1開始出現(xiàn),作為Date類的替代方案,Calendar類中包含了對不同國家地區(qū)日歷的處理,需要的朋友可以參考下
    2023-09-09
  • java實現(xiàn)字符串和數(shù)字轉(zhuǎn)換工具

    java實現(xiàn)字符串和數(shù)字轉(zhuǎn)換工具

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)字符串和數(shù)字轉(zhuǎn)換工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • idea使用spring Initializr 快速搭建springboot項目遇到的坑

    idea使用spring Initializr 快速搭建springboot項目遇到的坑

    這篇文章主要介紹了idea使用spring Initializr 快速搭建springboot項目遇到的坑,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Go?Java算法猜數(shù)字游戲示例詳解

    Go?Java算法猜數(shù)字游戲示例詳解

    這篇文章主要為大家介紹了Go?Java算法猜數(shù)字游戲示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 基于feign傳參MultipartFile問題解決

    基于feign傳參MultipartFile問題解決

    這篇文章主要介紹了基于feign傳參MultipartFile問題解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論