基于LinkedHashMap实现一个LRU算法的Cahce对象

LRU是什么?按照英文的直接原义就是Least Recently Used,最近最久未使用法,它是按照一个非常著名的计算机操作系统基础理论得来的:最近使用的页面数据会在未来一段时期内仍然被使用,已经很久没有使用的页面很有可能在未来较长的一段时间内仍然不会被使用。基于这个思想,会存在一种缓存淘汰机制,每次从内存中找到最久未使用的数据然后置换出来,从而存入新的数据!它的主要衡量指标是使用的时间,附加指标是使用的次数。在计算机中大量使用了这个机制,它的合理性在于优先筛选热点数据,所谓热点数据,就是最近最多使用的数据!因为,利用LRU我们可以解决很多实际开发中的问题,并且很符合业务场景。

需求:固定缓存大小maxCap为3,达到最大容量后,将最近最少使用的对象,从缓存移除.

package com.java.oop.features;
import java.util.LinkedHashMap;
//构建基于LRU算法的缓存对象(简易)
//缓存满了要淘汰长时间不访问的对象
class LruCache<K,V> extends LinkedHashMap<K,V>{
	  LinkedHashMap<K,V> removeElements=
			new LinkedHashMap<K, V>();//放移除的对象
	  private int maxCap;//记录最大容量
	  public LruCache(int cap) {
		super((int)Math.ceil(cap/0.75f)+1,0.75f,true);//调用父类有参构造,true表示访问顺序,false表示插入顺序
	    this.maxCap=cap;
	  }
	  //当我们执行put方法时,每次都会调用此方法
	  //方法返回值为true时表示满了,此时可以移除数据
	  @Override
	  protected boolean removeEldestEntry(
		java.util.Map.Entry<K, V> eldest) {
		boolean flag= size()>maxCap;
		if(flag) {
			removeElements.put(eldest.getKey(), eldest.getValue());
		}
		return flag;
	  }
}
public class TestExtends02 {
   public static void main(String[] args) {
	  LruCache<String,Object> cache=
	  new LruCache<>(3);
      cache.put("A", 100);
      cache.put("B", 200);
      cache.put("C", 300);
      cache.get("A");
      cache.put("D", 400);
      cache.put("E", 500);
      System.out.println(cache);
      System.out.println(cache.removeElements);
   } 
}

 

运行结果:

{A=100, D=400, E=500}
{B=200, C=300}

 

 

猜你喜欢

转载自blog.csdn.net/qianzhitu/article/details/102988575