免费推广网站地址大全,二手书网站建设目标,河南省大型项目建设办公室网站,厦门 网站建设 公司哪家好最近#xff0c;我偶然发现了Java面试问题之一#xff1a; “使用Java集合类实现最近使用的列表#xff08;LRU#xff09;缓存吗#xff1f;” 如果您以前曾处理过类似的问题#xff0c;那么对您来说真的很容易。 否则#xff0c;您将开始考虑实现LRU缓存的最佳收集类… 最近我偶然发现了Java面试问题之一 “使用Java集合类实现最近使用的列表LRU缓存吗” 如果您以前曾处理过类似的问题那么对您来说真的很容易。 否则您将开始考虑实现LRU缓存的最佳收集类。 大多数人没有意识到LinkedHashMap提供了支持并且可以用最少的代码直接使用。 什么是最近最少使用LRU缓存 如果您知道此概念请跳至实施部分。 缓存项逐出中使用了不同的算法。 最受欢迎的是最近最少使用的。 缓存始终具有有限的内存并且只能包含有限数量的项目。 它使用一种算法来检测和驱逐不值得保留的物品。 研究表明与旧项目相比新项目最有可能很快获得访问。 LRU基于此观察。 该算法跟踪项目的上次访问时间。 逐出具有最旧访问时间戳的项目。 LRU缓存实施 如果您想实现LRU缓存 LinkedHashMap确实很有帮助。 甚至Sun Java框架也使用此类来实现com.sun.tdk.signaturetest.util.LRUCache和sun.security.ssl.X509KeyManagerImpl.SizedMap 。 对于实现应该重写removeEldestEntry()方法。 在put()和putAll()之后调用此方法。 Map根据其返回值删除旧条目。 如果此方法返回true 那么将删除旧条目。 否则它可以留在Map 。 此方法的默认实现返回false 。 在这种情况下旧条目保留在Map中永远不会被删除 它只是充当一般的Map集合类。 在大多数实现中如果映射中的条目数大于初始容量则此方法返回true 。 package code4reference.test;import java.util.LinkedHashMap;
import java.util.Map;public class LRUCacheImpl extends LinkedHashMapInteger, 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.EntryInteger, 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()方法按过期状态打印对象。 从上面的代码中可以看到在插入Object4之前就插入了Object1Object2和Object3并访问了object1因此在输出的第一行中在Object4之前打印了Object1。 插入Object5时对象2从列表中逐出因为该对象是列表中最旧的对象。 当访问object3时它的提升将高于object5并且当插入object6时将驱逐对象1。 其余输出是不言自明的希望您在理解输出时不会遇到困难。 {2Object2, 3Object3, 1Object1, 4Object4}
{4Object4, 5Object5, 3Object3, 6Object6}
{6Object6, 4Object4, 7Object7, 8Object8}翻译自: https://www.javacodegeeks.com/2014/06/code4referencelist-recently-usedlru-implementation-using-linkedhashmap.html