美文网首页Java 杂谈
LRU 实现 通过 LinkedHashMap

LRU 实现 通过 LinkedHashMap

作者: 良人与我 | 来源:发表于2019-01-08 17:54 被阅读1次

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();
    }
}

相关文章

网友评论

    本文标题:LRU 实现 通过 LinkedHashMap

    本文链接:https://www.haomeiwen.com/subject/krubrqtx.html