LRU 实现 通过 LinkedHashMap

1 通过 LinkedHashMap

LinkedHashMap自身已经实现了顺序存储,默认情况下是按照元素的添加顺序存储,也可以启用按照访问顺序存储,即最近读取的数据放在最前面,最早读取的数据放在最后面,然后它还有一个判断是否删除最老数据的方法,默认是返回false,即不删除数据,我们使用LinkedHashMap实现LRU缓存的方法就是对LinkedHashMap实现简单的扩展,

public class LURCache extends LinkedHashMap {

    private int size;

    private LURCache(int size) {
        //当参数accessOrder为true时,即会按照访问顺序排序,最近访问的放在最前,最早访问的放在后面
        super(size, 0.75f, true);
        this.size = size;
    }

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

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

2 通过 linklist 实现

put 插入时候 如果没有则插入到头部,如果有则移动此条数据到头部。
如果超过了 cache容量 就删除 最后的记录。
get 操作 如果有则返回,并将此条数据移动到头部

public class LinkListCache  {

    private int size;

   public LinkedList 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  LinkListCache< V> newInstance(int size) {
        return new LinkListCache<>(size);
    }

    public static void main(String[] args) {
        LinkListCache 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();
    }
}

你可能感兴趣的:(LRU 实现 通过 LinkedHashMap)