使用LinkedHashMap的Code4ReferenceList最近使用(LRU)实现
最近,我偶然發(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 。
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么才能投诉方正宽带
- 下一篇: 编写干净的测试–用特定领域的语言替换断言