最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

概述

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

分析

什么是LRU?

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

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

LRU緩存實(shí)現(xiàn)

場景:我們需要設(shè)計(jì)一個(gè)緩存最多只能存儲(chǔ)10個(gè)元素,當(dāng)元素個(gè)數(shù)超過10的時(shí)候,刪除(淘汰)那些最近最少使用的數(shù)據(jù),僅保存熱點(diǎn)數(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)鍵值對(duì)個(gè)數(shù)超過最大容量時(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}

因?yàn)樽隽艘淮?code>cache.get("1"),相當(dāng)于操作了1這個(gè)元素,變"新"了,所以只能淘汰3, 4。

總結(jié)

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

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

相關(guān)文章

  • Java中的并發(fā)工具類詳細(xì)解析

    Java中的并發(fā)工具類詳細(xì)解析

    這篇文章主要介紹了Java中的并發(fā)工具類詳細(xì)解析,CountDownLatch、 CyclicBarrier 和 Semaphore 工具類提供了一種并發(fā)流程控制的手段,Exchanger 工具類則提供了在線程間交換數(shù)據(jù)的一種手段,需要的朋友可以參考下
    2023-12-12
  • Java中的Null到底是什么

    Java中的Null到底是什么

    null是沒有地址,""是有地址但是里面的內(nèi)容是空的,好比做飯 null說明連鍋都沒有 而""則是有鍋沒米,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來詳細(xì)學(xué)習(xí)一下它吧
    2019-06-06
  • Java基礎(chǔ)教程之List集合的常用方法

    Java基礎(chǔ)教程之List集合的常用方法

    這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之List集合的常用方法,在Java編程中List集合是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)一組元素,有時(shí)候我們需要對(duì)List集合中的元素進(jìn)行分組操作,即將相同屬性或特征的元素歸類到一組,需要的朋友可以參考下
    2023-10-10
  • 淺談ThreadLocal為什么會(huì)內(nèi)存泄漏

    淺談ThreadLocal為什么會(huì)內(nèi)存泄漏

    這篇文章主要介紹了淺談ThreadLocal為什么會(huì)內(nèi)存泄漏,每個(gè)Thread內(nèi)部維護(hù)著一個(gè)ThreadLocalMap,它是一個(gè)Map,這個(gè)映射表的Key是一個(gè)弱引用,其實(shí)就是ThreadLocal本身,Value是真正存的線程變量Object,需要的朋友可以參考下
    2023-12-12
  • JdbcTemplate操作數(shù)據(jù)庫的具體方法

    JdbcTemplate操作數(shù)據(jù)庫的具體方法

    這篇文章主要介紹了JdbcTemplate操作數(shù)據(jù)庫的具體操作方法,準(zhǔn)備工作需要大家先導(dǎo)入相關(guān)的jar包,建個(gè)數(shù)據(jù)庫,具體操作方法跟隨小編一起看看吧
    2022-03-03
  • Java中Array List與Linked List的實(shí)現(xiàn)分析

    Java中Array List與Linked List的實(shí)現(xiàn)分析

    這篇文章主要給大家介紹了關(guān)于Array List與Linked List實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java?JVM-clinit指令實(shí)現(xiàn)原理面試精講

    java?JVM-clinit指令實(shí)現(xiàn)原理面試精講

    這篇文章主要介紹了java?JVM-clinit指令實(shí)現(xiàn)原理面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • SpringBoot多級(jí)緩存實(shí)現(xiàn)方案總結(jié)

    SpringBoot多級(jí)緩存實(shí)現(xiàn)方案總結(jié)

    所謂多級(jí)緩存,是指在整個(gè)系統(tǒng)架構(gòu)的不同系統(tǒng)層面進(jìn)行數(shù)據(jù)緩存,以提升訪問速度,多級(jí)緩存就是為了解決項(xiàng)目服務(wù)中單一緩存使用不足的缺點(diǎn),本文我們將給大家總結(jié)了SpringBoot多級(jí)緩存實(shí)現(xiàn)方案,需要的朋友可以參考下
    2023-08-08
  • Java Big Number操作BigInteger及BigDecimal類詳解

    Java Big Number操作BigInteger及BigDecimal類詳解

    這篇文章主要為大家介紹了Java Big Number操作BigInteger及BigDecimal類詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • java面試LruCache?和?LinkedHashMap及算法實(shí)現(xiàn)

    java面試LruCache?和?LinkedHashMap及算法實(shí)現(xiàn)

    這篇文章主要為大家介紹了java面試LruCache?和?LinkedHashMap及算法實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論

衡水市| 天气| 县级市| 时尚| 宁城县| 尚志市| 万安县| 奉节县| 卢氏县| 工布江达县| 金川县| 洛南县| 台北县| 都江堰市| 峨边| 盈江县| 邓州市| 彝良县| 怀宁县| 永靖县| 岑巩县| 正蓝旗| 龙里县| 运城市| 湘乡市| 司法| 莱西市| 越西县| 旬邑县| 中牟县| 平昌县| 凤冈县| 石阡县| 龙口市| 高清| 甘泉县| 原阳县| 泸定县| 乌拉特中旗| 吉林省| 健康|