import java.util.HashMap;
public class LRUtest {
private class Node{ //构建链表
private String key;
private String value;
private Node pre;
private Node next;
public Node (String key,String value){
this.key = key;
this.value = value;
}
}
private Node head;
private Node end;
private int limit;
private HashMap<String,Node> hashMap; //同时用hashmap存储,形成链存储
public LRUtest(int limit){
this.limit = limit;
hashMap = new HashMap<String, Node>();
}
public String get(String key){ //获取某元素,但在使用完之后,刷新链表和hashmap,应为它最近被使用过了
Node node = hashMap.get(key);
if(node == null){
return null;
}
refreshNode(node);
return node.value;
}
public void put(String key,String value){ //添加节点
Node node = hashMap.get(key);
if(node == null){
if(hashMap.size()>=limit){ //如果到达最lru的最大元素个数,就先移除最久最少没被使用的元素
String oldkey = removeNode(head);
hashMap.remove(oldkey);
}
node = new Node(key,value);
addNode(node);
hashMap.put(key,node);
}else{
node.value = value; //如果要添加的元素已经存在,同样刷新
refreshNode(node);
}
}
public String removeNode(Node node){ //链表中移除,同时返回要移除的key,以便在hashmap中移除
if(node == end){ //如果移除的是表尾元素,则只改动end的pre指针
end = end.pre;
}else if(node == head){ //如果是头元素,只改动head的next指针
head = node.next;
}else{ //中间元素,前后元素都改动
node.pre.next = node.next;
node.next.pre = node.pre;
}
return node.key;
}
public void addNode(Node node){ //链表添加节点
if(end != null){
end.next = node;
node.pre = end;
node.next = null;
}
end = node;
if(head == null){
head = node;
}
}
public void refreshNode(Node node){ //刷新,采用先删除,后添加的方法。保证最近使用在表头
if(node == end){
return ;
}
removeNode(node);
addNode(node);
}
public void remove(String key){ //移除元素,链表删除后,hashmap也移除;
Node node = hashMap.get(key);
removeNode(node);
hashMap.remove(key);
}
}
LRU
最新推荐文章于 2024-09-03 20:55:04 发布