LRU过期策略的具体实现

1.LRU算法介绍:
           LRU是Least Recently Used 近期最少使用算法。内存管理的一种页面置换算法,对于在内存中但又不用的数据快(内存块)叫做LRU,
           Oracle会根据那些数据属于LRU而将其移出内存而腾出空间来加载另外的数据,一般用于大数据处理的时候很少使用的数据那么就直接请求数据库,如果经常请求的数据就直接在缓存里面读取。
          最近最久未使用(LRU)的页面置换算法,是根据页面调入内存后的使用情况进行决策的。由于无法预测各页面将来的使用情况,
          只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,
          用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰(可以使用这种方法去实现)。 

2.LinkedHashMap

1、LinkedHashMap可以认为是HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序。

2、LinkedHashMap的基本实现思想就是----多态。可以说,理解多态,再去理解LinkedHashMap原理会事半功倍;反之也是,对于LinkedHashMap原理的学习,也可以促进和加深对于多态的理解。

initialCapacity   初始容量大小,使用无参构造方法时,此值默认是16
loadFactor       加载因子,使用无参构造方法时,此值默认是 0.75f
accessOrder   false: 基于插入顺序     true:  基于访问顺序  重点看看accessOrder的作用,使用无参构造方法时,此值默认是false。

3.具体实现

package com.eebbk.onlinelesson.scheduler;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @Description:   实现LRU代码实现
 * @Time: 2020/12/3 17:23
 */

    public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    //初始内存容量
    private int capacity;
    //构造方法,传入一个参数
    LRUCache(int capacity){
        //调用LinkedHashMap,传入参数
        super(capacity,0.75f,true);
        this.capacity=capacity;
        //传递指定的最大内存容量
    }
 默认的removeEldestEntry方法是返回false的,也就是不会进行删除,而是进行扩容
    @Override
    public boolean removeEldestEntry(Map.Entry<K, V> eldest){
        //,每加入一个元素,就判断是size是否超过了已定的容量
        System.out.println("此时的size大小="+size());
        if((size()>capacity))
        {
         这个意思就是说当map中的数据量大于指定的缓存个数的时候,就自动删除最老的数据            
         System.out.println("超出已定的内存容量,把链表顶端元素移除:"+eldest.getValue());
        }
        return size()>capacity;
    }
    public static void main(String[] args) throws Exception{
        //initialCapacity   初始容量大小5
        Map<Integer,Integer> map=new LRUCache<Integer, Integer>(5);
        //新增6个值
        for(int i=1;i<=6;i++)
        {
            map.put(i,  i);
        }
        //遍历输出
        for(java.util.Map.Entry<Integer, Integer> entry: map.entrySet()){
            System.out.println(entry.getValue());
        }
    }
   /* 输出
    此时的size大小=1
    此时的size大小=2
    此时的size大小=3
    此时的size大小=4
    此时的size大小=5
    此时的size大小=6
    超出已定的内存容量,把链表顶端元素移除:1
            2
            3
            4
            5
            6
*/
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值