美文网首页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