LRU全稱是Least Recently Used,即最近最久未使用的意思。
LRU算法的設計原則是:如果一個數據在最近一段時間沒有被訪問到,那麼在將來它被訪問的可能性也很小。也就是說,當限定的空間已存滿數據時,應當把最久沒有被訪問到的數據淘汰。
解決的實際問題:當做數據緩存時,緩存的數據會隨着時間的推移越來越多,如果沒有緩存清除策略,那麼會出現倆個問題:1、緩存越來越大擠爆內存。2、很多不使用的數據佔據這內存空間,導致內存得不到有效利用。
此場景使用LRU算法非常合適。
LRU算法的主要思想:
1.設置一個緩存閾值,超過閾值刪除最老的數據。
2.保證最老的數據總是在鏈表的頭部,最新的數據總是在尾部,這樣每次需要刪除數據時把頭部數據刪除即可。
linkedHashMap對LRU算法的實現:
import java.util.LinkedHashMap; import java.util.Map; public class LRU<K,V> extends LinkedHashMap<K, V> implements Map<K, V>{ // private static final long serialVersionUID = 1L; public LRU(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor, accessOrder); } /** * @description 重寫LinkedHashMap中的removeEldestEntry方法,當LRU中元素多餘6個時, * 刪除最不經常使用的元素 * @author daoshao * @param eldest * @return * @see java.util.LinkedHashMap#removeEldestEntry(java.util.Map.Entry) */ @Override protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) { // TODO Auto-generated method stub if(size() > 6){ return true; } return false; } public static void main(String[] args) { LRU<Character, Integer> lru = new LRU<Character, Integer>( 16, 0.75f, true); String s = "abcdefghijkl"; for (int i = 0; i < s.length(); i++) { lru.put(s.charAt(i), i); } System.out.println("LRU中key爲h的Entry的值爲: " + lru.get('h')); System.out.println("LRU的大小 :" + lru.size()); System.out.println("LRU :" + lru); } }