importjava.util.Hashtable;/***
*@authoradmin
**/
public classLRUCache {private intcacheSize;private Hashtablenodes;private intcurrentSize;privateCacheNode first;privateCacheNode last;private classCacheNode {
CacheNode prev;
CacheNode next;
Object value;
Object key;
}public LRUCache(inti) {this.currentSize = 0;this.cacheSize =i;this.nodes = new Hashtable(i);
}publicObject get(Object key) {
CacheNode node=(CacheNode) nodes.get(key);if (node != null) {
moveToHead(node);returnnode.value;
}else{return null;
}
}public voidput(Object key, Object value) {
CacheNode node=(CacheNode) nodes.get(key);if (node == null) {if (currentSize >=cacheSize) {if (last != null)
nodes.remove(last.key);
removeLast();
}else{
currentSize++;
}
node= newCacheNode();
}
node.value=value;
node.key=key;
moveToHead(node);
nodes.put(key, node);
}publicObject remove(Object key) {
CacheNode node=(CacheNode) nodes.get(key);if (node != null) {if (node.prev != null) {
node.prev.next=node.next;
}if (node.next != null) {
node.next.prev=node.prev;
}if (last ==node)
last=node.prev;if (first ==node)
first=node.next;
}returnnode;
}public voidclear() {
first= null;
last= null;
}private voidremoveLast() {if (last != null) {if (last.prev != null)
last.prev.next= null;elsefirst= null;
last=last.prev;
}
}private voidmoveToHead(CacheNode node) {if (node ==first){return;
}if (node.prev != null){
node.prev.next=node.next;
}if (node.next != null){
node.next.prev=node.prev;
}if (last ==node){
last=node.prev;
}if (first != null) {
node.next=first;
first.prev=node;
}
first=node;
node.prev= null;if (last == null){
last=first;
}
}
}