LRU(LeastRecentlyUsed,近期最少用)是一种缓存算法,其核心思想是将近期最少用的缓存项移除,以便为更常见的缓存项腾出空间。
在实质应用中,LRU 算法被广泛用于缓存和页面置换。
2、Java 达成 LRU 缓存算法在 Java 中,可以用linkedHashMap来达成 LRU 缓存算法。
linkedHashMap 是 HashMap 的一个子类,其内部用双向链表维护元素的顺序。
具体达成思路如下:
继承 linkedHashMap,重写 removeEldestEntry 办法,该办法返回 true 表示需要移除最老的缓存项;
在架构办法中指定 accessOrder 为 true,如此在访问元素时就会把该元素移动到链表尾部,便捷后续查找和移除;
在访问缓存项时,用 get 办法获得元素,并通过 removeEldestEntry 办法来判断是不是需要移除最老的缓存项;
在添加缓存项时,用 put 办法将元素加入 linkedHashMap 中。
用 linkedHashMap 达成 LRU 缓存算法的示例代码如下:
importjava.util.linkedHashMap;importjava.util.Map;publicclassLRUCacheK,VextendslinkedHashMapK,V{privatefinalintcapacity;publicLRUCache(intcapacity){super(capacity,0.75f,true);this.capacity=capacity;}@OverrideprotectedbooleanremoveEldestEntry(Map.EntryK,Veldest){returnsize()capacity;}publicstaticvoidmain(String[]args){LRUCacheInteger,Stringcache=newLRUCache(3);cache.put(1,one);cache.put(2,two);cache.put(3,three);System.out.println(cache);//{1=one,2=two,3=three}cache.get(2);System.out.println(cache);//{1=one,3=three,2=two}cache.put(4,four);System.out.println(cache);//{3=three,2=two,4=four}}}
在上面的示例代码中,大家创建了一个 LRUCache 类,继承了 linkedHashMap,并在架构办法中指定了 accessOrder 为 true。
在 removeEldestEntry 办法中,当缓存项数目超越容量时返回 true,表示需要移除最老的缓存项。
在访问缓存项时,用 get 办法获得元素,假如缓存项数目超越容量,则会移除最老的缓存项。
在添加缓存项时,用 put 办法将元素加入 linkedHashMap 中。
最后,在 main 办法中对缓存进行测试。
应该注意的是,在用 linkedHashMap 达成 LRU 缓存时,需要指定 accessOrder 为 true,不然 linkedHashMap 会根据插入顺序维护元素的顺序,而不是访问顺序。






