LRUアルゴリズムの簡単な実現
3806 ワード
package com.hanchao.test0809;
import java.util.Hashtable;
public class LRUCache {
/**
*
* @author Administrator
*
*/
class CacheNode {
CacheNode prev;//
CacheNode next;//
Object value;//
Object key;//
CacheNode() {
}
}
private int cacheSize;
private Hashtable nodes;//
private int currentSize;
private CacheNode first;//
private CacheNode last;//
public LRUCache(int i) {
currentSize = 0;
cacheSize = i;
nodes = new Hashtable(i);//
}
/**
*
* @param key
* @return
*/
public Object get(Object key) {
CacheNode node = (CacheNode) nodes.get(key);
if (node != null) {
moveToHead(node);
return node.value;
} else {
return null;
}
}
/**
*
* @param key
* @param value
*/
public void put(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 = new CacheNode();
}
node.value = value;
node.key = key;
// , .
moveToHead(node);
nodes.put(key, node);
}
/**
*
* @param key
* @return
*/
public Object 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;
}
return node;
}
public void clear() {
first = null;
last = null;
}
/**
*
*
*/
private void removeLast() {
// , null. ( )
if (last != null) {
if (last.prev != null)
last.prev.next = null;
else
first = null;
last = last.prev;
}
}
/**
* ,
* @param node
*/
private void moveToHead(CacheNode node) {
if (node == first) {
// ,
return;
}
if (node.prev != null) {
// null,
node.prev.next = node.next;
}
if (node.next != null) {
// null,
node.next.prev = node.prev;
}
if (last == node) {
// ,
last = node.prev;
}
if (first != null) {
// null,
//
node.next = first;
first.prev = node;
}
first = node;
node.prev = null;
if (last == null) {
last = first;
}
}
}
参考:http://gogole.iteye.com/blog/692103 http://blog.chinaunix.net/uid-26147414-id-3435752.html
http://dennis-zane.iteye.com/blog/128278