package java_map;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K,V> extends LinkedHashMap<K, V> {
private static final long serialVersionUID = 1L;
private static final int MAX_ENTRIES = 3;
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
// TODO Auto-generated method stub
return size()>MAX_ENTRIES;
}
public LRUCache() {
super(16, 0.75f, true);
}
public static void main(String[] args) {
Map<Integer,String> cache = Collections.synchronizedMap(new LRUCache<>());
cache.put(1,"a");
cache.put(2,"b");
cache.put(3,"c");
System.out.println(cache.keySet());
cache.get(1);
System.out.println(cache.keySet());
cache.put(4, "d");
System.out.println(cache.keySet());
}
}
// linkedHashMap extends HashMap 具有和HashMap一樣快的查找速度
// 內部維護一個雙向鏈表,用來維護插入順序或者LRU順序
// 內部屬性accessOrder決定了順序,默認為false,此時維護的是插入順序
// 構造函數 LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder)
// when accessOrder = true
// get操作會將該節點移到鏈表尾部,保證鏈表尾部是最近訪問的節點,鏈表head節點就是最久未使用的節點
// put操作會將該節點移到鏈表尾部,保證鏈表尾部是最近訪問的節點,鏈表head節點就是最久未使用的節點
// put操作后,when removeEldestEntry()方法返回為true會移除最晚的節點。就是head節點
// removeEldestEntry()默認為false,如果為true,必須繼承LinkedHashMap重寫這個方法。
// 實例:實現LRU緩存,通過移除最近最久未使用的節點。從而保證緩存空間足夠。並且緩存的數據都是熱點數據