/ Java / 32浏览

LinkedHashMap 实现LRU

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

class LRUCache {

    private final LinkedHashMap<Integer, Integer> data;
    private final int capacity;

    public LRUCache(int capacity) {
        data = new LinkedHashMap<>(capacity);
        this.capacity = capacity;
    }

    public int get(int key) {
        // key存在要先移除再重新添加,保持在最后
        if (data.containsKey(key)) {
            Integer integer = data.get(key);
            data.remove(key);
            data.put(key, integer);
            return integer;
        }
        return -1;
    }

    public void put(int key, int value) {
        if (data.containsKey(key)) {
            data.remove(key);
        } else {
            // 超出容量移除第一个
            if (data.size() == capacity) {
                Iterator<Map.Entry<Integer, Integer>> iterator = data.entrySet().iterator();
                iterator.next();
                iterator.remove();
            }
        }
        data.put(key, value);
    }
}

利用 removeEldestEntry,重写这个方法,put进新值方法返回true时,会移除该map中最老的键和值。

class LRUCache extends LinkedHashMap<Integer, Integer>{
    private int capacity;
    
    public LRUCache(int capacity) {
        super(capacity, 0.75F, true);
        this.capacity = capacity;
    }

    public int get(int key) {
        return super.getOrDefault(key, -1);
    }

    public void put(int key, int value) {
        super.put(key, value);
    }

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