package com.study;
import java.util.HashMap;
/***
* 底层HashMap + 各个node用指针连接起来,将最新加入或者最新访问的node放在队列的右端,这样队列左端将是最“老”的node,内存不够时,从最左端淘汰元素。
* @author: 码出地球
*/
public class LRUCache<K, V> {
private HashMap<K,Node> cache = new HashMap<>();
Node left = new Node();
Node right = new Node();
public LRUCache(){
this.left.next = right;
this.right.pre = left;
}
class Node{
V value;
Node pre;
Node next;
public Node(){}
public Node(V value){
this.value = value;
}
}
/***
* 新添加的node放在队列的最右边
* 左 <=> node1 <=> node2 <=> node3 <=> 右
*
* 左 <=> node1 <=> node2 <=> newNode <=> 右
* @param key
* @param value
* @description:
* 这里只简单的处理了put新元素,当key存在时覆盖,且移到最右端的没有实现 ||_||
*/
public void put(K key, V value){
Node node = new Node(value);
Node temp = right.pre;
temp.next = node;
node.next = right;
node.pre = temp;
right.pre = node;
cache.put(key, node);
}
/***
* 例如node1被访问,移到队列的最右边
* 左 <=> node1 <=> node2 <=> node3 <=> 右
*
* 左 <=> node2 <=> node3 <=> node1 <=> 右
* @param key
*/
public Node get(K key){
Node node = cache.get(key);
node.pre.next = node.next;
node.next.pre = node.pre;
Node temp = right.pre;
temp.next = node;
node.next = right;
node.pre = temp;
right.pre = node;
return node;
}
public String toString(){
String result = "";
Node flag = left.next;
while (flag != null && flag != right){
result += flag.value.toString() + " ";
flag = flag.next;
}
return result;
}
}