利用LinkedHashMap实现LRU算法

package com.lza.outofmemory;

import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache extends LinkedHashMap{
 /**
  *定义缓存数
  */
 final int MAX_CACHE_SIZE;
 static final int MAXIMUM_CAPACITY = 1 << 30;
 public LRUCache(int cacheSize){
  /**
   * 初始化LinkedHashMap的构造函数,最后一个参数为true表示按访问顺序排序 即最近访问的在最前面 最少访问的在最后面
   */
  super((int) (((cacheSize/0.75))+1),0.75f,true);
  this.MAX_CACHE_SIZE=cacheSize;
 }
 public LRUCache(){
  super(16,0.75f,true);
  this.MAX_CACHE_SIZE=16;
 }
 /**
  * 重写removeEldestEntry()方法,告诉它什么时候需要删除容器中"最老"的元素:当参数LinkedHashMap中的accessOrder参数为true时
  * 最老元素表示最近最少使用的元素,当accessOrder参数为false时,最老元素表示最早插入的元素。
  */
 @Override
 protected boolean removeEldestEntry(Map.Entry eldest){
  if(size()>MAX_CACHE_SIZE){
   System.out.println("Key:"+eldest.getKey()+"    Value:"+eldest.getValue()+"  has been removed.");
   return true;
  }else{
   return false;
  }
 }
 public static void main(String[]args){
  //Map LRUCacheTest=Collections.synchronizedMap(new LRUCache(5)); 多线程环境下使用,确保线程安全
  Map LRUCacheTest=new LRUCache(5);
  /**
   * 创建5个 占满缓存
   */
  for(Integer i=0;i<5;i++){    
   LRUCacheTest.put(i, i.toString());
  }
  Iterator ite=LRUCacheTest.entrySet().iterator();
  System.out.println("原始的K-V键值对:");
  while(ite.hasNext()){
   Map.Entry temp=(Map.Entry)ite.next();
   System.out.println("Key:"+temp.getKey()+"    Value:"+temp.getValue());
  }
  /**
   * 刷新 0 和 2 的缓存
   */
  LRUCacheTest.put(0, "0");
  LRUCacheTest.put(2, "2");
  /**
   * 添加两个新的缓存 使最近两个最少使用的被移除
   */
  System.out.println("被移除的K-V键值对:");
  LRUCacheTest.put(5, "5");
  LRUCacheTest.put(6, "6");
  System.out.println("移除后缓存中的数据排列:");
  Iterator ite2=LRUCacheTest.entrySet().iterator();
  while(ite2.hasNext()){
   Map.Entry temp=(Map.Entry)ite2.next();
   System.out.println("Key:"+temp.getKey()+"    Value:"+temp.getValue());
  }
 }
}

你可能感兴趣的:(Java)