使用 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 来快速定位元素。当缓存达到容量上限时,它会淘汰掉最老的元素。

相关推荐
csdn_aspnet5 分钟前
ASP.NET Core 中的依赖注入
后端·asp.net·di·.net core
sheji526115 分钟前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
毕设源码-邱学长16 分钟前
【开题答辩全过程】以 基于Java Web的电子商务网站的用户行为分析与个性化推荐系统为例,包含答辩的问题和答案
java·开发语言
摇滚侠31 分钟前
Java项目教程《尚庭公寓》java项目从开发到部署,技术储备,MybatisPlus、MybatisX
java·开发语言
踩坑记录33 分钟前
leetcode hot100 23. 合并 K 个升序链表 hard 分治 迭代
leetcode·链表
€81143 分钟前
Java入门级教程24——Vert.x的学习
java·开发语言·学习·thymeleaf·数据库操作·vert.x的路由处理机制·datadex实战
Mr_star_galaxy1 小时前
【JAVA】经典图书管理系统的实现
java
昊坤说不出的梦1 小时前
【实战】监控上下文切换及其优化方案
java·后端
疯狂踩坑人1 小时前
【Python版 2026 从零学Langchain 1.x】(二)结构化输出和工具调用
后端·python·langchain
春生野草1 小时前
Redis
数据库·redis·缓存