lru实现
public class LRUTest {
@Data
static class Node {
private Object key;
private Object value;
//前指针
private Node pre;
//后指针
private Node prep;
public Node(Object key, Object value) {
this.key = key;
this.value = value;
}
}
//头节点
static private Node headNode;
//尾节点
static private Node lastNode;
//内存最大保存长度
static private final int MAX_SIZE = 3;
//链表当前长度
static private int nodeLength;
private static Map<Object, Node> map = new HashMap<>();
public static void put(Object key, Object value) {
boolean bool = map.containsKey(key);
if (bool) {
//如果存在
Node node = map.get(key);
Node pre1 = map.get(node.pre.key);
Node prep1 = map.get(node.prep.key);
if (pre1 == null) {
//此节点为头节点
headNode = node.prep;
headNode.pre = null;
node.pre = lastNode;
lastNode.prep = node;
lastNode = node;
Node node2 = new Node(key, value);
//同key覆盖
map.put(key, node2);
} else if (prep1 == null) {
//此节点为尾节点
Node node2 = new Node(key, value);
map.put(key, node2);
} else {
//中间节点
prep1.pre = pre1;
pre1.prep = prep1;
node.pre = lastNode;
lastNode.prep = node;
lastNode = node;
map.put(key, new Node(key, value));
}
} else {
if (nodeLength == 0) {
Node node = new Node(key, value);
map.put(key, node);
lastNode = node;
headNode = node;
nodeLength++;
} else if (nodeLength != 0 && nodeLength < MAX_SIZE) {
Node node = new Node(key, value);
node.setPre(lastNode);
lastNode.setPrep(node);
map.put(key, node);
lastNode = node;
nodeLength++;
} else {
map.remove(headNode.key);
headNode = headNode.prep;
headNode.pre = null;
Node node = new Node(key, value);
node.pre = lastNode;
lastNode.prep = node;
lastNode = node;
map.put(key, node);
}
}
}
public static void main(String args[]) {
put(1, 1);
put(2, 2);
put(3, 3);
put(2, 2);
map.size();
System.out.println(map.size());
}
}
本文介绍了一种基于双向链表和哈希表的数据结构来实现LRU(Least Recently Used,最近最少使用)缓存机制的方法。该实现利用了Java语言特性,并详细展示了如何通过自定义节点类和维护节点之间的前后指针来更新缓存状态,同时保持了缓存项的访问顺序,确保超出容量时可以迅速移除最久未使用的项。
421

被折叠的 条评论
为什么被折叠?



