日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用LinkedHashMap的Code4ReferenceList最近使用(LRU)实现

發(fā)布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用LinkedHashMap的Code4ReferenceList最近使用(LRU)实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近,我偶然發(fā)現(xiàn)了Java面試問題之一:

“使用Java集合類實(shí)現(xiàn)最近使用的列表(LRU)緩存嗎?”

如果您以前曾處理過類似的問題,那么對您來說真的很容易。 否則,您將開始考慮實(shí)現(xiàn)LRU緩存的最佳收集類。 大多數(shù)人沒有意識到LinkedHashMap提供了支持,并且可以用最少的代碼直接使用。

什么是最近最少使用(LRU)緩存

如果您知道此概念,請?zhí)翆?shí)施部分。 緩存項(xiàng)逐出中使用了不同的算法。 最受歡迎的是最近最少使用的。 緩存始終具有有限的內(nèi)存,并且只能包含有限數(shù)量的項(xiàng)目。 它使用一種算法來檢測和驅(qū)逐不值得保留的物品。 研究表明,與舊項(xiàng)目相比,新項(xiàng)目最有可能很快獲得訪問。 LRU基于此觀察。 該算法跟蹤項(xiàng)目的上次訪問時間。 逐出具有最舊訪問時間戳的項(xiàng)目。

LRU緩存實(shí)施

如果您想實(shí)現(xiàn)LRU緩存, LinkedHashMap確實(shí)很有幫助。 甚至Sun Java框架也使用此類來實(shí)現(xiàn)com.sun.tdk.signaturetest.util.LRUCache和sun.security.ssl.X509KeyManagerImpl.SizedMap 。
對于實(shí)現(xiàn),應(yīng)該重寫removeEldestEntry()方法。 在put()和putAll()之后調(diào)用此方法。 Map根據(jù)其返回值刪除舊條目。 如果此方法返回true ,那么將刪除舊條目。 否則,它可以留在Map 。 此方法的默認(rèn)實(shí)現(xiàn)返回false 。 在這種情況下,舊條目保留在Map中,永遠(yuǎn)不會被刪除; 它只是充當(dāng)一般的Map集合類。 在大多數(shù)實(shí)現(xiàn)中,如果映射中的條目數(shù)大于初始容量,則此方法返回true 。

package code4reference.test;import java.util.LinkedHashMap; import java.util.Map;public class LRUCacheImpl extends LinkedHashMap<Integer, String> {private static final long serialVersionUID = 1L;private int capacity;public LRUCacheImpl(int capacity, float loadFactor){super(capacity, loadFactor, true);this.capacity = capacity;}/*** removeEldestEntry() should be overridden by the user, otherwise it will not * remove the oldest object from the Map.*/@Overrideprotected boolean removeEldestEntry(Map.Entry<Integer, String> eldest){return size() > this.capacity;}public static void main(String arg[]){LRUCacheImpl lruCache = new LRUCacheImpl(4, 0.75f);lruCache.put(1, "Object1");lruCache.put(2, "Object2");lruCache.put(3, "Object3");lruCache.get(1);lruCache.put(4, "Object4");System.out.println(lruCache);lruCache.put(5, "Object5");lruCache.get(3);lruCache.put(6, "Object6");System.out.println(lruCache);lruCache.get(4);lruCache.put(7, "Object7");lruCache.put(8, "Object8");System.out.println(lruCache);} }

println()方法按過期狀態(tài)打印對象。 從上面的代碼中可以看到,在插入Object4之前就插入了Object1,Object2和Object3,并訪問了object1,因此在輸出的第一行中,在Object4之前打印了Object1。 插入Object5時,對象2從列表中逐出,因?yàn)樵搶ο笫橇斜碇凶钆f的對象。 當(dāng)訪問object3時,它的提升將高于object5,并且當(dāng)插入object6時,將驅(qū)逐對象1。 其余輸出是不言自明的,希望您在理解輸出時不會遇到困難。

{2=Object2, 3=Object3, 1=Object1, 4=Object4} {4=Object4, 5=Object5, 3=Object3, 6=Object6} {6=Object6, 4=Object4, 7=Object7, 8=Object8}

翻譯自: https://www.javacodegeeks.com/2014/06/code4referencelist-recently-usedlru-implementation-using-linkedhashmap.html

總結(jié)

以上是生活随笔為你收集整理的使用LinkedHashMap的Code4ReferenceList最近使用(LRU)实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。