146. LRU 缓存 --力扣 --JAVA

简介: ​请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。函数 get

 题目

请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。

实现 LRUCache 类:

    • LRUCache(int capacity)正整数 作为容量 capacity 初始化 LRU 缓存
    • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1
    • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

    函数 getput 必须以 O(1) 的平均时间复杂度运行。

    解题思路

      1. 由题可知,需要Map来存储数据,List可以通过通过控制添加到的索引位置来将数据提前;
      2. 对Map进行操作时,通过更新List涉及的数据;
      3. 溢出时从List获取末尾节点即最近最少使用的数据进行删除更新。

      代码展示

      class LRUCache {
          Map< Integer, Integer> lru = null;
          List<Integer> sort = null;
          int cap;
          public LRUCache(int capacity) {
              lru = new HashMap<>();
              sort = new ArrayList<>(capacity);
              cap = capacity;
          }
          public int get(int key) {
              Integer val = lru.get(key);
              if(val != null){
                  sort.remove((Integer) key);
                  sort.add(0, key);
                  return val;
              } else {
                  return -1;
              }
          }
          public void put(int key, int value) {
              if(lru.containsKey(key)){
                  lru.put(key,value);
                  sort.remove((Integer) key);
                  sort.add(0, key);
              } else {
                  if (lru.size() == cap) {
                      int last = sort.get(cap - 1);
                      sort.remove(cap - 1);
                      lru.remove(last);
                  }
                  lru.put(key, value);
                  sort.add(0, key);
              }
          }
      }

      image.gif


      目录
      相关文章
      |
      5天前
      |
      缓存 安全 Java
      7张图带你轻松理解Java 线程安全,java缓存机制面试
      7张图带你轻松理解Java 线程安全,java缓存机制面试
      |
      5天前
      |
      缓存 算法 Java
      数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
      数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
      |
      5天前
      |
      缓存 算法 前端开发
      前端开发者必知的缓存淘汰策略:LRU算法解析与实践
      前端开发者必知的缓存淘汰策略:LRU算法解析与实践
      |
      6天前
      |
      缓存 算法 Java
      Java本地高性能缓存实践
      本篇博文将首先介绍常见的本地缓存技术,对本地缓存有个大概的了解;其次介绍本地缓存中号称性能最好的Cache,可以探讨看看到底有多好?怎么做到这么好?最后通过几个实战样例,在日常工作中应用高性能的本地缓存。
      |
      6天前
      |
      缓存 算法
      LRU(Least Recently Used)算法是一种常用的计算机缓存替换算法
      【5月更文挑战第4天】LRU算法是基于页面使用频率的缓存策略,优先淘汰最近最久未使用的页面。实现可采用双向链表或数组,前者灵活,后者时间复杂度低。优点是利用时间局部性提高命中率,简单易实现;缺点是占用空间,对循环访问和随机访问场景适应性不佳。
      32 0
      |
      6天前
      |
      缓存 NoSQL Java
      17:缓存机制-Java Spring
      17:缓存机制-Java Spring
      41 5
      |
      6天前
      |
      存储 缓存 算法
      面试遇到算法题:实现LRU缓存
      V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。
      |
      6天前
      |
      存储 缓存 监控
      构建高效的Java缓存策略
      【4月更文挑战第18天】本文探讨了如何构建高效的Java缓存策略,强调缓存可提升系统响应和吞吐量。关键因素包括缓存位置、粒度、失效与更新策略、并发管理、序列化及选择合适库(如Ehcache、Guava Cache、Caffeine)。最佳实践包括明确需求、选择合适解决方案、监控调整及避免常见陷阱。缓存优化是一个持续过程,需根据需求变化不断优化。
      |
      6天前
      |
      缓存 NoSQL Java
      使用Redis进行Java缓存策略设计
      【4月更文挑战第16天】在高并发Java应用中,Redis作为缓存中间件提升性能。本文探讨如何使用Redis设计缓存策略。Redis是开源内存数据结构存储系统,支持多种数据结构。Java中常用Redis客户端有Jedis和Lettuce。缓存设计遵循一致性、失效、雪崩、穿透和预热原则。常见缓存模式包括Cache-Aside、Read-Through、Write-Through和Write-Behind。示例展示了使用Jedis实现Cache-Aside模式。优化策略包括分布式锁、缓存预热、随机过期时间、限流和降级,以应对缓存挑战。
      |
      6天前
      |
      存储 缓存 Java
      java如何实现一个LRU(最近最少使用)缓存?
      实现了一个LRU缓存,使用双向链表保持访问顺序,哈希表用于定位元素。Java代码中,`LRUCache`类包含容量、哈希表及链表头尾节点。`get`方法查哈希表,找到则移动至链表头并返回值,否则返回-1。`put`方法更新或插入节点,超出容量则移除最不常用节点。
      16 6

      热门文章

      最新文章