本文共 2828 字,大约阅读时间需要 9 分钟。
要设计并实现一个满足约束的LRUCache类,需仔细考虑其核心功能和性能要求。以下是优化后的详细步骤和实现思路:
问题理解与需求分析:
结构设计:
优化考虑:
构造函数:
get方法:
put方法:
import java.util.*;public class LRUCache { // 主要的哈希表用于存储键值对 Mapcache = new HashMap<>(); // 双向链表记录每个节点的访问顺序 DoubleLinkedHashSet order = new DoubleLinkedHashSet<>(); // 双向链表辅助类,内置指针结构 static class Node { int key; int value; Node prev = null; Node next = null; } // 初始化LRUCache LRUCache(int capacity) { this.capacity = capacity; // 初始化链表的各种结构,只需要单个虚拟节点启动 } // 获取数据 int get(int key) { if (cache.containsKey(key)) { Node node = cache.get(key); // 移到链表的末尾,记录最近使用 order.remove(node); order.add(node); return node.value; } else { return -1; } } // 插入或更新数据 void put(int key, int value) { if (cache.containsKey(key)) { Node oldNode = cache.get(key); order.remove(oldNode); // 更新节点的位置 Node newNode = new Node(); newNode.key = key; newNode.value = value; newNode.prev = oldNode.next; newNode.next = oldNode; // 插入到双向链表的最后 order.add(newNode); cache.put(key, newNode); } else { // 检查是否已经超出容量 if (cache.size() >= capacity) { // 移除最旧的节点 Node oldRemoved = orderppeelFirst(); // 删除哈希表中的对应值 cache.remove(((LRUCache.Node) oldRemoved).key); // 同时处理链表节点 oldRemoved.prev.next = null; oldRemoved = null; } Node newNode = new Node(); newNode.key = key; newNode.value = value; newNode.prev = null; newNode.next = order.peekLast(); // 插入到链表末尾 order.add(newNode); cache.put(key, newNode); } } // 移除链表中最旧的节点 private Node orderppeelFirst() { return order.iterator().next(); }}
哈希表选择:
链表维护:
容量管理:
性能考虑:
扩展性:
转载地址:http://kagyk.baihongyu.com/