LRU缓存实现

本章主要介绍通过Java自带的LinkedHashMap做LRU以及自实现LRU。

public class LRUCache extends LinkedHashMap{
    private int capacity;

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

    public void setCapacity(int capacity){
        this.capacity = capacity;
    }

}

自实现LRUCache。

思路:

  • 设定容量,所以需要容量的计算
  • 存储数据,所以内部可以借助HashMap
  • 需要知道淘汰的数据,并且维持一个相对有序的关系,所以可以用链表,通过头结点和尾节点做顺序保持
  • 节点可以自定义,包含双向关系
public class LRUCache{
    private int capacity = 0;
    private Map<String, LRUNode> map;

    private LRUNoe head, tail;

    public LRUCache(int capacity){
        this.capacity = capacity;
        map = new HashMap<>();
    }

    public Object get(String key){
        LRUNOde node = map.get(key);
        if(node == null) return null;
        
        remove(node, false);
        setHead(node);
        return node.val;
    }

    public void put(String key, Object val){
        LRUNode node = map.get(key);
        if(node == null){
            node = new LRUNode(key, val);
            if(map.size() >= capacity){
                remove(tail, true);
            }
            map.put(key, node);
        }else{
            node.val = val;
            remove(node, false);
        }
        setHead(node);
    }

    private void setHead(LRUNode node){
        if(this.head != null){
            node.next = head;
            head.prev = node;
        }
        head = node;
        
        if(this.tail == null){
            tail = node;
        }
    }

    private void remove(LRUNode node, boolean flag){
        if(node.pre != null){
            node.pre.next = node.next;
        }else{
            head =  node.next;
        }

        if(node.next != null){
            node.next.pre = node.pre;
        }else{
            tail = node.pre;
        }

        if(flag){
            map.remove(node);
        }
    }


    private static class LRUNode{
        private String key;
        private Object val;
        private LRUNode pre, next;
        public LRUNode(String key, Object val){
            val = val;
            key = key;
        }
    }

}

 

发布了147 篇原创文章 · 获赞 25 · 访问量 16万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览