java 代码实现LRU算法

LRU简单介绍

LRU(Least Recently Used)是一种常见的页面置换算法,在计算中,所有的文件操作都要放在内存中进行,然而计算机内存大小是固定的,所以我们不可能把所有的文件都加载到内存,因此我们需要制定一种策略对加入到内存中的文件进项选择。

实现思虑

1、数据需要保存,可以使用ConcurrentHashMap
2、需要记录数据的先后关系,常见的保存方式可以是数组、链表,但是使用数组则不方便修改数据保存的位置。大部分同学都应该会刷面试题,arrayList 和 LinkedList 的区别,应该都清楚,LinkedList在数据的增删方面具有极大的优势。但是此处我们更适合双向链表,默认拥有头、尾部节点。
3、rul算法需要一个限定储存数据的长度

java代码实现

LRUCache.java

public class LRUCache<V> {
   
    private int capacity = 1024;
    private Map<String,MyNode<String,V>> map = new ConcurrentHashMap<>();
    private MyNode head;
    private MyNode tail;

    public LRUCache(){
   
        this.head = new MyNode();
        this.tail = new MyNode();
        this.head.nextNode = tail;
        this.tail.preNode = head;
    }
    //为方便测试以及动态控制容量
    public LRUCache(int capacity){
   
        this.head = new MyNode();
        this.tail = new MyNode();
        this.capacity = capacity;
        this.head.nextNode = tail;
        this.tail.preNode = head;
    }

    //
    public V get(String key){
   
        MyNode<String,V> curNode = map.get(key);
        if(curNode==null){
   
            return null;
        }else if(curNode==head.nextNode){
   
            //获取数据就是头部最新 数据,无需处理
            return curNode.val;
        }
        //1 headNext 指向curNode.next
        MyNode<String,V> headNext = head.nextNode;
        headNext.nextNode = curNode.nextNode;
        curNode.nextNode.preNode = headNext.nextNode;

        //2 head.next 指向curNode
        curNode
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值