LRU的java实现

import java.util.concurrent.ConcurrentHashMap;

public class LRUCache {
    private ConcurrentHashMap<String, LRUNode> hashMap = new ConcurrentHashMap<>();
    private int capacity;//容量
    private LRUNode head;//头
    private LRUNode tail;//尾

    /**
     * 设置缓存
     *
     * @param key   键
     * @param value 值
     */
    public void set(String key, Object value) {
        LRUNode node = hashMap.get(key);
        if (node != null) {
            node.value = value;
            remove(node, false);
        } else {
            node = new LRUNode(key, value);
            if (hashMap.size() >= capacity) {
                // 每次容量不足时先删除最久未使用的元素
                remove(tail, true);
            }
            hashMap.put(key, node);
        }
        // 将刚添加的元素设置为head
        setHead(node);
    }

    /**
     * 取缓存
     *
     * @param key 键
     * @return 值
     */
    public Object get(String key) {
        LRUNode node = hashMap.get(key);
        if (node != null) {
            // 将刚操作的元素放到head
            remove(node, false);
            setHead(node);
            return node.value;
        }
        return null;
    }

    private void setHead(LRUNode node) {
        // 先从链表中删除该元素
        if (head != null) {
            node.next = head;
            head.prev = node;
        }
        head = node;
        if (tail == null) {
            tail = node;
        }
    }

    // 从链表中删除此Node,此时要注意该Node是head或者是tail的情形
    private void remove(LRUNode node, boolean flag) {
        if (node.prev != null) {
            node.prev.next = node.next;
        } else {
            head = node.next;
        }
        if (node.next != null) {
            node.next.prev = node.prev;
        } else {
            tail = node.prev;
        }
        node.next = null;
        node.prev = null;
        if (flag) {
            hashMap.remove(node.key);
        }
    }

    public LRUCache(int capacity) {
        this.capacity = capacity;
    }

    private class LRUNode {
        String key;
        Object value;
        LRUNode prev;
        LRUNode next;

        private LRUNode(String key, Object value) {
            this.key = key;
            this.value = value;
        }
    }

}复制代码


转载于:https://juejin.im/post/5d033c40f265da1bc07e35dc

猜你喜欢

转载自blog.csdn.net/weixin_33860722/article/details/93167060
今日推荐