public classLRUCache {/*** @Author Niuxy
* @Date 2020/6/7 12:20 上午
* @Description 双向链表,记录最近访问顺序*/
private classLRUNode {
LRUNode(Integer key,Integer value) {this.value =value;this.key =key;
}
LRUNode next;
LRUNode pre;
Integer value;
Integer key;
}//虚拟头结点
privateLRUNode firstNode;//虚拟尾结点
privateLRUNode lastNode;//当前数据长度
private intsize;//缓存容量
private intcapacity;private MapcacheMap;
LRUCache(intcapacity) {this.size = 0;this.capacity =capacity;this.firstNode = new LRUNode(0, Integer.MIN_VALUE);this.lastNode = new LRUNode(0, Integer.MAX_VALUE);this.cacheMap = new HashMap();
firstNode.next=lastNode;
lastNode.pre=firstNode;
}//查找元素
publicInteger get(Integer key) {
LRUNode node=cacheMap.get(key);if (node == null) {return -1;
}
removeToHead(node);returnnode.value;
}//新增元素
public voidput(Integer key, Integer value) {
LRUNode beforeNode=cacheMap.get(key);//key 已存在,覆盖
if (beforeNode != null) {
beforeNode.value=value;
removeToHead(beforeNode);return;
}
LRUNode node= newLRUNode(key, value);
cacheMap.put(key, node);
putToHead(node);
size++;if (size >capacity) {
removeLast();
size--;
}
printList();
}private final voidputToHead(LRUNode node) {
node.next=firstNode.next;
firstNode.next=node;
node.pre=firstNode;
node.next.pre=node;
}private final voidremoveToHead(LRUNode node) {
removeNode(node.key);
putToHead(node);
}private final voidremoveLast() {
removeNode(lastNode.pre.key);
}private final voidremoveNode(Integer key) {
LRUNode node=cacheMap.get(key);if (node == null) {return;
}
node.pre.next=node.next;
node.next.pre=node.pre;
cacheMap.remove(key);
}private voidprintList() {
LRUNode node=firstNode.next;
System.out.print("***");while (node !=lastNode) {
System.out.print(node.key+ ":" + node.value + " , ");
node=node.next;
}
System.out.println(" --- ");
}
}