java LinkedHashMap實現LRUCache緩存


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緩存,通過移除最近最久未使用的節點。從而保證緩存空間足夠。並且緩存的數據都是熱點數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM