使用LinkedHashMap的Code4ReferenceList最近使用(LRU)实现
最近,我偶然發(fā)現(xiàn)了Java面試問題之一:
“使用Java集合類實現(xiàn)最近使用的列表(LRU)緩存嗎?”
如果您以前曾處理過類似的問題,那么對您來說真的很容易。 否則,您將開始考慮實現(xiàn)LRU緩存的最佳收集類。 大多數(shù)人沒有意識到LinkedHashMap提供了支持,并且可以用最少的代碼直接使用。
什么是最近最少使用(LRU)緩存
如果您知道此概念,請?zhí)翆嵤┎糠帧?緩存項逐出中使用了不同的算法。 最受歡迎的是最近最少使用的。 緩存始終具有有限的內(nèi)存,并且只能包含有限數(shù)量的項目。 它使用一種算法來檢測和驅(qū)逐不值得保留的物品。 研究表明,與舊項目相比,新項目最有可能很快獲得訪問。 LRU基于此觀察。 該算法跟蹤項目的上次訪問時間。 逐出具有最舊訪問時間戳的項目。
LRU緩存實施
如果您想實現(xiàn)LRU緩存, LinkedHashMap確實很有幫助。 甚至Sun Java框架也使用此類來實現(xiàn)com.sun.tdk.signaturetest.util.LRUCache和sun.security.ssl.X509KeyManagerImpl.SizedMap 。
對于實現(xiàn),應該重寫removeEldestEntry()方法。 在put()和putAll()之后調(diào)用此方法。 Map根據(jù)其返回值刪除舊條目。 如果此方法返回true ,那么將刪除舊條目。 否則,它可以留在Map 。 此方法的默認實現(xiàn)返回false 。 在這種情況下,舊條目保留在Map中,永遠不會被刪除; 它只是充當一般的Map集合類。 在大多數(shù)實現(xiàn)中,如果映射中的條目數(shù)大于初始容量,則此方法返回true 。
println()方法按過期狀態(tài)打印對象。 從上面的代碼中可以看到,在插入Object4之前就插入了Object1,Object2和Object3,并訪問了object1,因此在輸出的第一行中,在Object4之前打印了Object1。 插入Object5時,對象2從列表中逐出,因為該對象是列表中最舊的對象。 當訪問object3時,它的提升將高于object5,并且當插入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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么才能投诉方正宽带
- 下一篇: 使用Java 8 Streams进行编程