LinkedHashMap 與 LRU

問:簡單說說什么是 LRU板丽?

答:LRU 是一種流行的替換算法,它的全稱是 Least Recently Used,最近最少使用兑凿,常常在緩存設(shè)計的場景中充當(dāng)一種策略,它的核心思路是最近剛被使用的很快再次被用的可能性最高茵瘾,而最久沒被訪問的很快再次被用的可能性最低礼华,所以被優(yōu)先清理。

問:請使用 Java 集合實現(xiàn)一個簡約優(yōu)雅的 LRU 容器拗秘?

答:由于 LinkedHashMap 天生支持插入順序或者訪問順序的 key-value 對圣絮,而 LRU 算法的核心恰巧用到它的訪問順序特性,即對一個鍵執(zhí)行 get雕旨、put 操作后其對應(yīng)的鍵值對會移到鏈表末尾扮匠,所以最末尾的是最近訪問的,最開始的是最久沒被訪問的凡涩。

LinkedHashMap 有一個 boolean 類型的 accessOrder 參數(shù)棒搜,當(dāng)該參數(shù)為 true 時則按照元素最后訪問時間在雙向鏈表中排序,為 false 則按照插入順序排序活箕,默認為 false力麸,所以這里需要的操作就是 accessOrder 為 true 的情況。

所以基于 LinkedHashMap 的特性實現(xiàn)的 LRU 容器如下:

        public class LRUCache<K, V> extends LinkedHashMap<K, V> {
            private int maxEntries;//maxEntries 最大緩存?zhèn)€數(shù)

            public LRUCache(int maxEntries) {
                super(16, 0.75f, true);
                this.maxEntries = maxEntries;
            }

            //在添加元素到LinkedHashMap后會調(diào)用這個方法育韩,傳遞的參數(shù)是最久沒被訪問的鍵值對克蚂,
            // 如果這個方法返回true則這個最久的鍵值對就會被刪除,LinkedHashMap的實現(xiàn)總是返回false筋讨,
            // 所以容量沒有限制埃叭。
            @Override
            protected boolean removeEldestEntry(Entry<K, V> eldest) {
                return size() > maxEntries;
            }
        }

可以看見實現(xiàn)的簡約 LRU 容器核心優(yōu)雅點就是充分利用了 LinkedHashMap 的有序性特性和容量限制特性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悉罕,一起剝皮案震驚了整個濱河市赤屋,隨后出現(xiàn)的幾起案子误墓,更是在濱河造成了極大的恐慌,老刑警劉巖益缎,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谜慌,死亡現(xiàn)場離奇詭異,居然都是意外死亡莺奔,警方通過查閱死者的電腦和手機欣范,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來令哟,“玉大人恼琼,你說我怎么就攤上這事叉讥〖チ冢” “怎么了苟径?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵激捏,是天一觀的道長。 經(jīng)常有香客問我盗温,道長霎迫,這世上最難降的妖魔是什么爽室? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任神年,我火速辦了婚禮已维,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘已日。我一直安慰自己垛耳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布飘千。 她就那樣靜靜地躺著堂鲜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪护奈。 梳的紋絲不亂的頭發(fā)上缔莲,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音逆济,去河邊找鬼酌予。 笑死,一個胖子當(dāng)著我的面吹牛奖慌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播松靡,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼简僧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雕欺?” 一聲冷哼從身側(cè)響起岛马,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤棉姐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啦逆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伞矩,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年夏志,在試婚紗的時候發(fā)現(xiàn)自己被綠了乃坤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沟蔑,死狀恐怖湿诊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘦材,我是刑警寧澤厅须,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站食棕,受9級特大地震影響朗和,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜簿晓,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一例隆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抢蚀,春花似錦镀层、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屋休,卻和暖如春坞古,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背劫樟。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工痪枫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叠艳。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓奶陈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親附较。 傳聞我的和親對象是個殘疾皇子吃粒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容