public classLRUCache {private Mapmap;privateCacheEntry head , tail;private intmaxSize;public LRUCache(intmaxSize){if(maxSize < 1){throw new IllegalArgumentException("Cache maxSize has to be at least 1");
}this.map = new HashMap();
head= new CacheEntry("head","");
tail= new CacheEntry("tail", "");
head.setNext(tail);
tail.setPrev(head);this.maxSize =maxSize;
}public voidadd(String key, String value){
CacheEntry cacheEntry=map.get(key);if(cacheEntry == null){
cacheEntry= newCacheEntry(key, value);if(map.size() ==maxSize){//缓存达到最大数目//删除最老的条目
CacheEntry deleteEntry =tail.getPrev();//从map中移除
map.remove(deleteEntry.getKey());//从队列中移除
remove(deleteEntry);
}//添加条目到队列
addFront(cacheEntry);//添加到map
map.put(key, cacheEntry);
}else{//更新值
cacheEntry.setValue(value);//访问条目
accessed(cacheEntry);
}
}publicString search(String key){
CacheEntry entry=map.get(key);if(entry == null){return null;
}
accessed(entry);returnentry.getValue();
}//打印缓存内容
public voidprint(){
CacheEntry entry=head.getNext();while(entry !=tail){
System.out.println("{" + entry.getKey() + ":" + entry.getValue() + "}");
entry=entry.getNext();
}
System.out.println();
}public voidaccessed(CacheEntry entry) {if(entry.getPrev() !=head){
remove(entry);
addFront(entry);
}
}private voidaddFront(CacheEntry entry) {//在队列的头部添加条目
CacheEntry nextEntry =head.getNext();
head.setNext(entry);
entry.setPrev(head);
entry.setNext(nextEntry);if(nextEntry != null){
nextEntry.setPrev(entry);
}
}private voidremove(CacheEntry entry) {if(entry == head || entry ==tail){return;//错误
}
entry.getPrev().setNext(entry.getNext());if(entry.getNext() != null){
entry.getNext().setPrev(entry.getPrev());
}
}
}/*** Created by admin on 2018/3/30.*/
public classCacheEntry {privateCacheEntry prev, next;privateString key, value;
CacheEntry(String key, String value){this.key =key;this.value =value;
}publicCacheEntry getPrev() {returnprev;
}public voidsetPrev(CacheEntry prev) {this.prev =prev;
}publicCacheEntry getNext() {returnnext;
}public voidsetNext(CacheEntry next) {this.next =next;
}publicString getKey() {returnkey;
}publicString getValue() {returnvalue;
}public voidsetValue(String value) {this.value =value;
}
}