LRU 缓存机制
https://leetcode-cn.com/problems/lru-cache/
public class LRUCache {LinkedHashMap<Integer, Integer> map;public LRUCache(int capacity) {map = new LinkedHashMap<>(capacity + 2, 1, true){@Overrideprotected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {return size() > capacity;}};}public int get(int key) {Integer r = map.get(key);if(r != null)return r;else return -1;}public void put(int key, int value) {map.put(key, value);}}
import java.util.HashMap;
import java.util.Map;
public class LRUCache {
class Node {
Node prev;
Node next;
int key;
int value;
public Node() {
}
public Node(int key, int value) {
this.key = key;
this.value = value;
}
}
private Map<Integer, Node> map = new HashMap<>();
private int size;
private int capacity;
private Node head, tail;
public LRUCache(int capacity) {
this.capacity = capacity;
this.size = 0;
head = new Node();
tail = new Node();
head.next = tail;
tail.prev = head;
}
public int get(int key) {
Node temp = map.get(key);
if (temp == null)
return -1;
else {
moveToFirst(temp);
return temp.value;
}
}
public void put(int key, int value) {
Node temp = map.get(key);
if (temp == null) { // 新节点
Node add = new Node(key, value);
addFirst(add);
map.put(key, add);
size++;
if (size > capacity) {
map.remove(remove(tail.prev));
}
} else {
temp.value = value;
moveToFirst(temp);
}
}
private void moveToFirst(Node node) {
remove(node);
addFirst(node);
}
private void addFirst(Node node) {
node.next = head.next;
head.next = node;
node.prev = head;
node.next.prev = node;
}
private int remove(Node node) {
node.prev.next = node.next;
node.next.prev = node.prev;
return node.key;
}
}
