先看下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
參考:排序