java基于Hash表和双向链表简单实现LRU Cache
标签:cap lru 实现 public int port class 头结点 void
package lru;
import java.util.HashMap;
public class LRUCache2 {
public final int capacity;
class DNode{
K key;
V value;
DNode next;
DNode pre;
public DNode(K key, V value, LRUCache2.DNode pre, LRUCache2.DNode next) {
super();
this.key = key;
this.value = value;
this.pre = pre;
this.next = next;
}
}
//附加头结点
DNode head=new DNode(null,null,null,null);
DNode last=head;
HashMap map=new HashMap();
public LRUCache2(int capacity) {
this.capacity=capacity;
}
public V get(K key) {
DNode node=map.get(key);
if(node!=null) {
moveToHead(node);
}
return node==null?null:node.value;
}
public void put(K key, V value) {
DNode node=map.get(key);
if(node==null) {
if(map.size()>=capacity) {
removeLast();
}
node=new DNode(key, value,head,head.next);
if(head.next!=null)
head.next.pre=node;
head.next=node;
map.put(node.key, node);
if(last==head) last=node;
}else {
node.value=value;
moveToHead(node);
}
}
private void removeLast() {
// TODO Auto-generated method stub
if(last==null) {
throw new IllegalArgumentException("cant remove before put");
}
map.remove(last.key);
last.pre.next=null;
last=last.pre;
}
private void moveToHead(LRUCache2.DNode node) {
// TODO Auto-generated method stub
if(head.next==node) return;
if(last==node) {
last=node.pre;
}
node.pre.next=node.next;
if(node.next!=null) node.next.pre=node.pre;
node.next=head.next;
node.pre=head;
head.next.pre=node;
head.next=node;
}
}
java基于Hash表和双向链表简单实现LRU Cache
标签:cap lru 实现 public int port class 头结点 void
原文地址:https://www.cnblogs.com/lshao/p/9650673.html
评论