LRU 實現 通過 LinkedHashMap

weixin_34194087發表於2019-01-08

1 通過 LinkedHashMap

LinkedHashMap自身已經實現了順序儲存,預設情況下是按照元素的新增順序儲存,也可以啟用按照訪問順序儲存,即最近讀取的資料放在最前面,最早讀取的資料放在最後面,然後它還有一個判斷是否刪除最老資料的方法,預設是返回false,即不刪除資料,我們使用LinkedHashMap實現LRU快取的方法就是對LinkedHashMap實現簡單的擴充套件,

public class LURCache<K,V> extends LinkedHashMap<K,V> {

    private int size;

    private LURCache(int size) {
        //當引數accessOrder為true時,即會按照訪問順序排序,最近訪問的放在最前,最早訪問的放在後面
        super(size, 0.75f, true);
        this.size = size;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > size;
    }

    public static <K, V> LURCache<K, V> newInstance(int size) {
        return new LURCache<>(size);
    }
}

2 通過 linklist 實現

put 插入時候 如果沒有則插入到頭部,如果有則移動此條資料到頭部。
如果超過了 cache容量 就刪除 最後的記錄。
get 操作 如果有則返回,並將此條資料移動到頭部

public class LinkListCache<V>  {

    private int size;

   public LinkedList<V> linkedList;

   public V get(V v){
       int index = linkedList.indexOf(v);
      if(index == -1){
            //addToHead(v);
           return null;
       }
       moveToHead(index);
       return v;
   }
    public V put(V v){
        int index = linkedList.indexOf(v);
        if(index == -1){
            linkedList.addFirst(v);
            addToHead(v);
        }
        else{
            moveToHead(index);
        }

        return v;
    }

   private void moveToHead(int index){
       V v = linkedList.remove(index);
       linkedList.addFirst(v);
   }
   private void addToHead(V e){
       linkedList.addFirst(e);
       if(linkedList.size() >= size){
           linkedList.removeLast();
       }
   }

   public void show(){
       linkedList.forEach(t->{
           System.out.println(t);
       });
   }

    public LinkListCache(int size) {
        this.size = size;
        this.linkedList = new LinkedList<>();
    }

    public static <V> LinkListCache< V> newInstance(int size) {
        return new LinkListCache<>(size);
    }

    public static void main(String[] args) {
        LinkListCache<String> cache = LinkListCache.newInstance(5);
        cache.put("hello");
        cache.put("world");
        cache.put("river");
        cache.put("crazzy");
        cache.put("frank");
        cache.put("lucy");
        cache.show();
        System.out.println(" =================  ");
        cache.get("river");
        cache.show();
    }
}

相關文章