Android之LinkedHashMap實現LRU

先看下LinkedHashMap的數據結構圖算法



對於LinkedHashMap而言,它繼承與HashMap、底層使用哈希表與雙向鏈表來保存全部元素。其基本操做與父類HashMap類似,它經過重寫父類相關的方法,來實現本身的連接列表特性。根據鏈表中元素的順序能夠分爲:按插入順序的鏈表,和按訪問順序(調用get方法)的鏈表。數組

LinkedHashMap採用的hash算法和HashMap相同,可是它從新定義了數組中保存的元素Entry,該Entry除了保存當前對象的引用外,還保存了其上一個元素before和下一個元素after的引用,從而在哈希表的基礎上又構成了雙向連接列表。數據結構

LinkedHashMap定義了排序模式accessOrder,該屬性爲boolean型變量,對於訪問順序,爲true;對於插入順序,則爲false。ide

當有新元素加入Map的時候會調用Entry的addEntry方法,會調用removeEldestEntry方法,這裏就是實現LRU元素過時機制的地方,默認的狀況下removeEldestEntry方法只返回false表示元素永遠不過時spa

public class Tester {
    private static int MAX=5;
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashMap<String,String> map = new LinkedHashMap<String, String>(MAX/2,0.5f,true)
        {
            @Override
            protected boolean removeEldestEntry(Map.Entry<String, String> eldest){
                if(size()>MAX){
                    return true;
                }
                return false;
            }
        };
        map.put("a", "a");
        map.put("b", "b");
        map.put("c", "c");
        map.put("d", "d");
        map.put("e", "e");
        map.put("c", "c");
        for (Map.Entry<String, String> entry : map.entrySet()) {  
            System.out.print(entry.getValue() + ", ");  
        }  
        System.out.println();
        
        map.get("b");
        for (Map.Entry<String, String> entry : map.entrySet()) {  
            System.out.print(entry.getValue() + ", ");  
        }  
        System.out.println();
        
        map.put("f", "f");
        for (Map.Entry<String, String> entry : map.entrySet()) {  
            System.out.print(entry.getValue() + ", ");  
        }  
        System.out.println();
    }

}

a, b, d, e, c,
a, d, e, c, b,
d, e, c, b, f, code

 

可見最新加入的或者最近get過的就會往最後放,若是put數目大於max,就會把頭上那個去掉,而後f加到最後,其餘往前移。對象

因此說不僅是put,get也會把Entry日後方,越日後的說明最近才訪問過的,越往前的說明最近最少訪問的,這就實現了一個簡單的LRU。blog

參考:排序

http://uule.iteye.com/blog/1522291繼承

http://woming66.iteye.com/blog/1284326

相關文章
相關標籤/搜索