LRU缓存:java实现

1、LRU缓存

package cn.hq;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;

/**
 * @Author: hq
 * @Date: 2021/3/1 18:07
 * @Description:
 * LRU缓存应支持get、put
 * get(key):获取数据。若key存在,则获取值,否则返回-1
 * put(key,value):如果存在则变更该数据,如果不存在则插入该值。当缓存容量达到上限时,删除最久未使用的数据
 *
 * 思路:用map存放数据,链表存放key值,每次使用get都会将key移动到链表末尾。链头最前方数据表示最久未使用

优化:linkedHashmap
 */
public class LRUCache {
    private final int SIZE;  //用于存放缓存容量
    private HashMap<Integer,Integer> map;  //用于存放数据
    private LinkedList<Integer> list;
    public LRUCache(int size){
        this.SIZE=size;
        map=new HashMap<>();
        list=new LinkedList<>();
    }

    public boolean put(int key,int value){
        if(map.size()>=SIZE) {
            //缓存容量达到上限
            int temp=list.removeFirst();  //出队
            map.remove(temp);         //删除最久未使用的值
        }
        map.put(key,value);
        list.addLast(key);           //将当前put的key入队
        return true;
    }

    public int get(int key){
        if(map.get(key)==null)
            return -1;
        //使用该值,将其移动到队尾
        Object obj=map.get(key);  //让list按值删除
        list.remove(obj);
        list.add(key);
        return map.get(key);
    }

    public static void main(String[] args) {
        LRUCache cache=new LRUCache(2);
        cache.put(1,1);
        cache.put(2,2);
        System.out.println(cache.get(1));  //返回1
        cache.put(3,3);
        System.out.println(cache.get(2));  //2作废,返回-1
        cache.put(4,4);
        System.out.println(cache.get(1));  //1作废,返回-1
        System.out.println(cache.get(3));  //返回3
        System.out.println(cache.get(4));  //返回4
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值