题目介绍

题解代码
package com.sugon.cloud.utils
import java.util.HashMap
import java.util.Iterator
import java.util.Map
/**
* @Auther: liuyunshengsir
* @Date: 2021/9/29 22:40
* @Description: LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰
*/
public class LRUCache {
class DLinkedNode {
int key
int value
DLinkedNode prev
DLinkedNode next
public DLinkedNode() {}
public DLinkedNode(int _key, int _value) {key = _key
}
private Map<Integer, DLinkedNode> cache = new HashMap<>()
private int size
private int capacity
private DLinkedNode head, tail
public LRUCache(int capacity) {
this.size = 0
this.capacity = capacity
// 使用伪头部和伪尾部节点
head = new DLinkedNode()
tail = new DLinkedNode()
head.next = tail
tail.prev = head
}
public int get(int key) {
DLinkedNode node = cache.get(key)
if (node == null) {
return -1
}
// 如果 key 存在,先通过哈希表定位,再移到头部
moveToHead(node)
return node.value
}
public void put(int key, int value) {
DLinkedNode node = cache.get(key)
if (node == null) {
// 如果 key 不存在,创建一个新的节点
DLinkedNode newNode = new DLinkedNode(key, value)
// 添加进哈希表
cache.put(key, newNode)
// 添加至双向链表的头部
addToHead(newNode)
++size
if (size > capacity) {
// 如果超出容量,删除双向链表的尾部节点
DLinkedNode tail = removeTail()
// 删除哈希表中对应的项
cache.remove(tail.key)
--size
}
}else {
// 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部
node.value = value
moveToHead(node)
}
}
private void addToHead(DLinkedNode node) {
node.prev = head
node.next = head.next
head.next.prev = node
head.next = node
}
private void removeNode(DLinkedNode node) {
node.prev.next = node.next
node.next.prev = node.prev
}
private void moveToHead(DLinkedNode node) {
removeNode(node)
addToHead(node)
}
private DLinkedNode removeTail() {
DLinkedNode res = tail.prev
removeNode(res)
return res
}
public static void main(String[] args) {
LRUCache lRUCache = new LRUCache(3)
lRUCache.put(1, 1)
lRUCache.put(2, 2)
lRUCache.get(1)
lRUCache.put(3, 3)
lRUCache.get(2)
lRUCache.put(4, 4)
lRUCache.get(1)
lRUCache.get(3)
lRUCache.get(4)
// 查看最后剩余的值
Iterator iterator= lRUCache.cache.keySet().iterator()
while (iterator.hasNext()){
System.out.println(iterator.next())
}
}
}