JAVA实现的LRU算法

214 阅读1分钟

实现1,通过linkedHashMap实现

public class LRUCache1<T,K> {
    private Map<T,K> map;
    private int size;

    public LRUCache1(int size) {
        this.size = size;
        map = new LinkedHashMap<>(size);
    }

    public K get(T t) {
        if (!map.containsKey(t)) {
            return null;
        }
        K temp = map.get(t);
        map.remove(t);
        map.put(t,temp);
        return temp;
    }

    public void put(T t,K k) {
        if (map.size() >= size) {
            Set<T> set = map.keySet();
            map.remove(set.iterator().next());
        }
        map.put(t,k);
    }

    public int getSize() {
        return map.size();
    }

    @Override
    public String toString() {
        return map.toString();
    }

    public static void main(String[] args) {
        LRUCache1<Integer,Integer> lruCache1 = new LRUCache1<>(3);
        lruCache1.put(1,1);
        lruCache1.put(2,2);
        lruCache1.put(3,3);
        System.out.println(lruCache1);
        lruCache1.put(4,4);
        System.out.println(lruCache1);
    }
}

实现2,复写linkedHashMap

public class LRUCache2<T,K> {
    private Map<T,K> map;
    private int size;

    public LRUCache2(int size) {
        this.size = size;
        map = new LinkedHashMap<T, K>(size,0.75f,true) {
            @Override
            protected boolean removeEldestEntry(Map.Entry<T, K> eldest) {
                return getSize() > size;
            }
        };
    }

    public K get(T t) {
        return map.get(t);
    }

    public void put(T t,K k) {
        map.put(t,k);
    }

    public int getSize() {
        return map.size();
    }

    @Override
    public String toString() {
        return map.toString();
    }

    public static void main(String[] args) {
        LRUCache2<Integer,Integer> lruCache1 = new LRUCache2<>(3);
        lruCache1.put(1,1);
        lruCache1.put(2,2);
        lruCache1.put(3,3);
        System.out.println(lruCache1);
        lruCache1.put(4,4);
        System.out.println(lruCache1);
    }
}