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

相关推荐
Seven972 分钟前
【设计模式】从智能音箱到软件设计:探索外观模式的实际应用案例
java·后端·设计模式
功德+n3 分钟前
Apache Log4j 2
java·开发语言·log4j·maven·apache
uhakadotcom4 分钟前
利用Supabase构建高并发应用的7大技巧
后端·面试·github
YGGP6 分钟前
【每日八股】Golang篇(三):关键字(下)
开发语言·后端·golang
uhakadotcom7 分钟前
Rust 高并发编程入门指南
后端·面试·github
Seven977 分钟前
【设计模式】如何通过桥接模式解决系统扩展难题?
java·后端·设计模式
熬了夜的程序员9 分钟前
Go 语言封装 HTTP 请求的 Curl 工具包
后端·程序人生·http·golang
uhakadotcom10 分钟前
Go语言高并发编程技巧:让你的程序飞起来
后端·面试·github
CodeCraft Studio15 分钟前
PDF处理控件Aspose.PDF,如何实现企业级PDF处理
java·python·pdf
uhakadotcom17 分钟前
高并发浏览器自动化:Playwright和Puppeteer技巧
后端·面试·github