java使用LinkedHashMap实现LUR算法

9 篇文章 0 订阅

概述

LRU是Least Recently Used的缩写,即最近最少使用算法。

通俗来讲就是没被调用的往后靠,被调用的往前靠,位置不够的时候就淘汰最后一个。

LinkedHashMap实现

java实现可以通过重写LinkedHashMap的removeEldestEntry方法来实现淘汰机制。

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

/**
 * @Author JQiang
 * @create 2021/4/6 17:41
 */
public class LRULinkedHashMap{
    public static void main(String[] args){
        LinkedHashMap<Integer,Integer> list = new LinkedHashMap<Integer,Integer>(5,0.75f,true){
            @Override
            protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
                return size() > 5;
            }
        };
        list.put(1,1);
        list.put(2,2);
        list.put(3,3);
        list.put(4,4);
        list.put(5,5);
        list.put(6,6);
        list.put(7,7);
        list.get(4);
        for (Map.Entry<Integer, Integer> e :
                list.entrySet()) {
            System.out.println(e.getKey());
        }
    }
}

这里对removeEldestEntry的重写,意思是如果list里的 大小超过了我预设的值5就会把先插入而且没被调用的删掉。

构造器里主要介绍一下accessOrder参数,注释里解释到false是基于插入顺序,true是基于访问顺序排序,我们get一个元素后,这个元素会被加到最后,实现了LRU的最近最少被使用的调度算法。

剩下的参数一个是容量大小和加载因子。

上面程序运行结果:

3
5
6
7
4

容量为5,当插入6、7时,会执行removeEldestEntry方法,将之前的1、2删除,然后调用了get方法,把4的位置调到了最新的位置上。

List实现

list实现的就很简单了,很多功能和逻辑都很差,不过基本实现了LRU的思想。

import java.util.LinkedList;
import java.util.List;

/**
 * @Author JQiang
 * @create 2021/4/6 16:57
 */
public class LRULinkdList {
    static int maxSize = 5;
    public static void main(String[] args){
        List<Integer> list = new LinkedList<>();

        insert(list,1);
        insert(list,2);
        insert(list,3);
        insert(list,4);
        insert(list,5);
        get(3,list);
//        insert(list,maxSize,7);
        for (Integer i :
                list) {
            System.out.println(i);
        }
    }
    public static void insert(List<Integer> list,int num){
        if (maxSize != list.size()){
            list.add(num);
        }else if (list.contains(num)){
            list.remove(list.indexOf(num));
            list.add(num);
        }else {
            list.remove(0);
            list.add(num);
        }
    }
    public static int get(int num,List<Integer> list){
        for (Integer integer:
                list) {
            if (integer == num){
                boolean remove = list.remove(integer);
                insert(list,num);
                return num;
            }
        }
        return -1;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值