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());
}
}