基于LinkedHashMap实现LRU缓存

基于LinkedHashMap实现LRU缓存

原理

LinkedHashMap中的removeEldestEntry方法能够移除最近最少使用的key,所以只需要重写这个方法,判断map中的size大小和初始cahe的大小并返回true就行

实现


public class LinkedHashMapBasedLRUCache<K, V> {
     

    private final int size;

    private LinkedHashMap<K, V> cacheMap;

    public LinkedHashMapBasedLRUCache(int size) {
     
        this.size = size;
        cacheMap = new LinkedHashMap<K, V>(size){
     
            @Override
            protected boolean removeEldestEntry(Map.Entry eldest) {
     
                if (cacheMap.size() > size){
     
                    return true;
                }
                return false;
            }
        };
    }

    public void put(K k, V v){
     
        this.cacheMap.put(k, v);
    }

    public V get(K k){
     
        return this.cacheMap.get(k);
    }

    public int size(){
     
        return this.cacheMap.size();
    }

    public Map<K, V> data(){
     
        return this.cacheMap;
    }
}

测试

  @Test
  public void lruCacheTest() {
     
      LinkedHashMapBasedLRUCache<String, String> cache = new LinkedHashMapBasedLRUCache<>(2);
      cache.put("a", "a");
      cache.put("b", "b");
      System.out.println("size: " + cache.size());
      System.out.println("cache: " + cache.data());
      System.out.println("after add third key");
      cache.put("c", "b");
      System.out.println("size: " + cache.size());
      System.out.println("cache: " + cache.data());

  }

结果:

size: 2
cache: {a=a, b=b}
after add third key
size: 2
cache: {b=b, c=b}

可以发现首次添加的key[a]已经被删除了,而且cache的大小也保持在初始大小2的容量

你可能感兴趣的:(java)