- LRU,least recently used,最近最少使用
- 它假设:最近不常使用的数据,在未来被用到的可能性也不大。
所以,当内存达到一定阈值时,要从哈希表中移除最近最少被使用的数据。 - 实现
主要基于哈希链表这种数据结构实现。哈希链表可以看作是 哈希表+双向链表。在哈希表中每个键值对与其他键值对并不相关联,但是在哈希链表中每个键值对可以看作一个链表中的节点,两个节点之间存在着前向指针和后向指针。 - 代码
import java.util.HashMap;
public class LRU2 {
Node head;
Node end;
HashMap<String,Node> hashMap;
int limit;
public LRU2(int capa){
limit=capa;
hashMap=new HashMap<>();
}
public void put(String key,String value){
Node node=hashMap.get(key);
if(node==null){
if(hashMap.size()>=limit){
removeNode(head);
hashMap.remove(head.key);
}
node=new Node(key,value);
addNode(node);
hashMap.put(key,node);
}else{
node.value=value;
refreshNode(node);
}
}
public String get(String key){
Node node=hashMap.get(key);
if(node==null){
return null;
}
refreshNode(node);
return node.value;
}
public void remove(String key){
Node node=hashMap.get(key);
removeNode(node);
hashMap.remove(node.key);
}
private String removeNode(Node node){
if(head==node&&end==node){
head=null;
end=null;
} else if (head==node) {
head=head.next;
head.pre=null;
} else if (end==node) {
end=end.pre;
end.next=null;
}else{
node.pre.next=node.next;
node.next.pre=node.pre;
}
return node.key;
}
private void addNode(Node node){
if(head==null&&end==null){
head=node;
end=node;
} else{
end.next=node;
node.pre=end;
end=node;
}
}
private void refreshNode(Node node){
if(end==node){
return;
}
removeNode(node);
addNode(node);
}
public static void main(String[] args) {
LRU2 lru2=new LRU2(5);
lru2.put("001","User 1 info");
lru2.put("002","User 2 info");
lru2.put("003","User 3 info");
lru2.put("004","User 4 info");
lru2.remove("001");
System.out.println(lru2.get("001"));
}
}
class Node{
String key;
String value;
Node pre;
Node next;
public Node(String k,String v){
this.key=k;
this.value=v;
}
}