基於LinkedhashMap實現的LRU算法

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);
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章