使用 LinkedList 实现一个高效的缓存系统

使用 LinkedList 实现一个高效的缓存系统通常涉及到实现一个最近最少使用(LRU, Least Recently Used)缓存淘汰算法。LRU 缓存是一种常用的缓存淘汰策略,它会在缓存满时淘汰最长时间未被使用的元素。

以下是使用 LinkedListHashMap 实现 LRU 缓存的步骤:

  1. 使用 LinkedList 存储缓存项的顺序:最近访问的项放在链表头部,最老访问的项放在链表尾部。
  2. 使用 HashMap 存储键和对应节点的映射:这样可以快速地通过键访问到缓存项的节点。

实现步骤:

  • 当访问一个缓存项时,如果它在缓存中:
    • 将其移动到链表的头部,表示最近被访问。
  • 如果缓存项不在缓存中:
    • 从链表尾部移除最老的项(如果缓存已满)。
    • 在链表头部添加新的缓存项。
    • HashMap 中添加键和新节点的映射。

示例代码:

java 复制代码
import java.util.HashMap;
import java.util.Map;

public class LRUCache<K, V> {
    private final int capacity;
    private final Map<K, Node<K, V>> map;
    private final LinkedList<Node<K, V>> list;

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

    public V get(K key) {
        Node<K, V> node = map.get(key);
        if (node == null) {
            return null;
        }
        // Move the accessed node to the head of the list
        list.remove(node);
        list.addFirst(node);
        return node.value;
    }

    public void put(K key, V value) {
        Node<K, V> node = map.get(key);

        if (node != null) {
            // Update the value and move to head
            node.value = value;
            list.remove(node);
            list.addFirst(node);
        } else {
            // Create a new node and add to head
            if (map.size() == capacity) {
                // Remove the least recently used item
                K lastKey = list.getLast().key;
                map.remove(lastKey);
                list.removeLast();
            }
            Node<K, V> newNode = new Node<>(key, value);
            list.addFirst(newNode);
            map.put(key, newNode);
        }
    }

    private static class Node<K, V> {
        K key;
        V value;
        Node<K, V> prev, next;

        public Node(K key, V value) {
            this.key = key;
            this.value = value;
        }
    }
}

使用示例:

java 复制代码
public class LRUCacheDemo {
    public static void main(String[] args) {
        LRUCache<Integer, String> cache = new LRUCache<>(2);

        cache.put(1, "one");
        cache.put(2, "two");
        System.out.println(cache.get(1)); // 输出 "one"
        cache.put(3, "three"); // 淘汰 "two"
        System.out.println(cache.get(2)); // 输出 null,因为 "two" 已被淘汰
        cache.put(4, "four"); // 淘汰 "one"
        System.out.println(cache.get(1)); // 输出 null
    }
}

这个 LRUCache 类实现了一个简单的 LRU 缓存系统,它使用 LinkedList 来维护元素的访问顺序,并使用 HashMap 来快速定位元素。当缓存达到容量上限时,它会淘汰掉最老的元素。

相关推荐
蜜桃小阿雯4 分钟前
JAVA开源项目 校园美食分享平台 计算机毕业设计
java·jvm·spring boot·spring cloud·intellij-idea·美食
黄昏_7 分钟前
苍穹外卖Day01-2
java·spring
努力的八爪鱼19 分钟前
记录工作中遇到的问题(持续更新~)
java
求学小火龙21 分钟前
ElasticSearch介绍+使用
java·大数据·elasticsearch
mikey棒棒棒22 分钟前
算法练习题25——合并多项式
java·算法·hashmap·哈希·多项式
kimloner24 分钟前
工厂模式(二):工厂方法模式
java·设计模式·工厂方法模式
月临水34 分钟前
JavaEE:网络编程(UDP)
java·网络·udp·java-ee
Deryck_德瑞克40 分钟前
Java集合笔记
java·开发语言·笔记
孟诸1 小时前
计算机专业毕设-校园新闻网站
java·vue·毕业设计·springboot·课程设计
Lingbug1 小时前
.Net日志组件之NLog的使用和配置
后端·c#·.net·.netcore