自制一个指定容量缓存,并实现最近使用的最后删除

需求

  • 实现一个缓存key-value结构,并设定容量最大值,
  • 当put进去的时候,如果超过最大容量,则将最早放进去的删除
  • 当get的时候,返回key值,并将key放到后面(表示最近使用过,最后删除)

上代码

import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

/**
 * 实现一个缓存key-value结构,并设定容量最大值,
 * 当put进去的时候,如果超过最大容量,则将最早放进去的删除
 * 当get的时候,返回key值,并将key放到后面(表示最近使用过,最后删除)
 */
public class LRUCache {
        private Map<String, Object> cache;
	    private Deque<String> deque;
	    private int capacity;

        public LRUCache(int capacity) {
	        this.capacity = capacity;
	        this.cache = new HashMap<>();
	        this.deque = new LinkedList<>();
	    }

        public Object get(String key) {
	        if (!cache.containsKey(key)) {
	            return -1;
	        }
	        deque.remove(key); // 删掉原key,将其移到队列尾
	        deque.offerLast(key);
	        return cache.get(key);
	    }

        public void put(String key, Object value) {
	        if (cache.containsKey(key)) {
	            deque.remove(key); // 删掉原key,将其移到队列尾
	        } else if (cache.size() >= capacity) {
	            String removed = deque.pollFirst(); // 移除队首(最久未使用)
	            cache.remove(removed);
	        }
	        cache.put(key, value);
	        deque.offerLast(key);
	    }

    @Override
    public String toString() {
        return "LRUCache{" +
                "cache=" + cache +
                ", deque=" + deque +
                ", capacity=" + capacity +
                '}';
    }
}

测试效果

public class LRUCacheTest {
    public static void main(String[] args) {
        LRUCache lruCache = new LRUCache(5);
        lruCache.put("aa", "aa");
        lruCache.put("bb", "bb");
        lruCache.put("cc", "cc");
        lruCache.put("dd", "dd");
        lruCache.put("ee", "ee");
        System.out.println(lruCache);
        lruCache.get("aa");
        System.out.println(lruCache);
        lruCache.put("ff", "ff");
        System.out.println(lruCache);
        
    }
}

结果:
在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 09:00:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 09:00:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 09:00:04       58 阅读
  4. Python语言-面向对象

    2024-07-18 09:00:04       69 阅读

热门阅读

  1. 算法刷题笔记 排列数字(C++实现)

    2024-07-18 09:00:04       20 阅读
  2. Mac更新完系统出现两步报错及解决方法

    2024-07-18 09:00:04       21 阅读
  3. UNIX中sigaction和sigevent有啥区别

    2024-07-18 09:00:04       20 阅读
  4. MySQL第七次作业

    2024-07-18 09:00:04       18 阅读
  5. C语言 二叉树,一个猜动物的小游戏

    2024-07-18 09:00:04       15 阅读
  6. RabbitMQ 和 RocketMQ 的区别

    2024-07-18 09:00:04       21 阅读
  7. conda 使用

    2024-07-18 09:00:04       18 阅读
  8. 为什么MySQL会选择B+树作为索引

    2024-07-18 09:00:04       24 阅读
  9. 计算机视觉篇2 图像分类

    2024-07-18 09:00:04       19 阅读
  10. B树(B-Tree)数据结构

    2024-07-18 09:00:04       22 阅读
  11. 547. 省份数量

    2024-07-18 09:00:04       23 阅读