LRU缓存

作者: mrjunwang | 来源:发表于2018-09-20 14:48 被阅读0次

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) – Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) – Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

解题思路:本题巧妙的使用linkedhashmap数据结构。linkedhashmap中使用了双向链表实现有序,其中有一个boolean字段accessOrder,默认为false,表示按照插入的顺序保持有序,如果为true,则表示按照访问的顺序保持有序。每次访问map中的元素时,被访问的元素会被插入到链表头,当容量超过map的指定容量时,删除链表头部的方法(即为最近最少使用的)。

首先设计一个map继承linkedhashmap

/**
 * @author jy
 * @date 2018年9月20日
 * <p>Description: </p> 
 */
package design;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author jy
 *
 */
public class LRULinkedHashMap<K,V> extends LinkedHashMap<K, V>{
    private int capacity;
    public LRULinkedHashMap(int capacity){
        super(capacity,0.75f,true);//按照访问顺序维护双向循环链表
        this.capacity=capacity;
    }
    
    /**
     * 当map中的容量超过指定的容量后,删除eldest
     */
    public boolean removeEldestEntry(Map.Entry<K, V> entry){
        if(this.entrySet().size()>capacity){
            return true;
        }
        return false;
        
    }
}

然后写自己的LRUCache

public class LRUCache {
   
   private LRULinkedHashMap<Integer, Integer> cache;
   public LRUCache(int capacity){
       cache=new LRULinkedHashMap<>(capacity);
   }
   public void set(int key,int value){
       cache.put(key, value);
   }
   
   public int get(int key){
       Integer value=this.cache.get(key);
       if(null == value){
           return -1;
       }
       return value;
   }
   

   /**
    * @param args
    *<p>Description: </p>  
    */
   public static void main(String[] args) {

       LRUCache cache=new LRUCache(3);
       cache.set(1, 1);
       cache.set(2, 2);
       cache.set(3, 3);
       
       int value1=cache.get(3);
       int value2=cache.get(2);
       int value3=cache.get(1);
       
       cache.set(4, 4);
       
       System.out.println(cache.get(1));
       System.out.println(cache.get(2));

       System.out.println(cache.get(3));
       System.out.println(cache.get(4));


   }

}
image.png

相关文章

网友评论

      本文标题:LRU缓存

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