java 自定义策略_java 自定义 LRU(最近最少使用)策略 实现 缓存机制

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值