package Test03;
import java.util.HashMap;
/**
* @description: LRU缓存结构
* @author: Dream
* @date: 2021-07-30 15:03
**/
public class LRUCache {
private static HashMap<Integer,Node> cache=new HashMap<>();
private int size;
private int capacity;
private Node head;
private Node tail;
public static void main(String[] args) {
LRUCache lruCache=new LRUCache(4);
lruCache.put(1,1);
lruCache.put(2,2);
lruCache.put(3,3);
lruCache.put(4,4);
lruCache.get(2);
lruCache.put(3,33);
lruCache.put(5,5);
}
//缓存构造函数
public LRUCache(int capacity){
this.size=0;
this.capacity=capacity;
this.head=new Node();
this.tail=new Node();
head.next=tail;
tail.prev=head;
}
public int get(int key){
Node node=cache.get(key);
if(node==null){
return -1;
}
//存在,移动到头部
moveToHead(node);
return node.value;
}
public void put(int key,int value){
Node node=cache.get(key);
if(node==null){
//不存在,创建节点加入头部
Node node1=new Node(key,value);
addToHead(node1);
cache.put(key,node1);
++size;
if(size>capacity){
//如何超过最大容量,删除尾节点
Node node2=removeTail();
cache.remove(node2.key);
--size;
}
}else{
node.value=value;
moveToHead(node);
}
}
//移动到头部(先删除,在移动)
public void moveToHead(Node node){
removeNode(node);
addToHead(node);
}
//直接添加到头部
public void addToHead(Node node){
node.prev = head;
node.next = head.next;
head.next.prev = node;
head.next = node;
}
//删除节点
public void removeNode(Node node){
node.prev.next = node.next;
node.next.prev = node.prev;
}
//删除尾节点
public Node removeTail(){
Node res = tail.prev;
removeNode(res);
return res;
}
//结构体节点
class Node{
int key;
int value;
Node next;
Node prev;
public Node(){
}
public Node(int key,int value){
this.key=key;
this.value=value;
}
}
}
手撕LRU——字节常考
最新推荐文章于 2022-04-16 22:44:27 发布