Java 彻底手撕LRU设计(使用JDK容器与不使用JDK容器)

本文详述两种Java中实现LRU缓存的方法:利用JDK的LinkedHashMap和HashMap+LinkedList,以及如何不依赖JDK容器,通过自定义HashMap以O(1)复杂度实现LRU算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 彻底手撕LRU设计(使用JDK容器与不使用JDK容器)

原博链接

JDK 1.8

本文讲述了两种利用JDK容器实现LRU的方法,以及最后不使用JDK容器,自己定义HashMap和链表来纯手工打造时间复杂度为O(1)的LRU算法。


§ 使用JDK容器

1、使用LinkedHashMap

这种方式比较简单,注释都在代码里

public class LRUCache<K,V>{
    // 使用泛型
    private LinkedHashMap<K, V> cache;
    private int capacity; // 容量

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

    public V get(K key) {
   
        if (cache.containsKey(key)) {
   
            V val = cache.get(key);
            cache.remove(key); // 删除key
            cache.put(key, val); // 重新put,实现了生命周期的更新
            return val;
        } else {
   
            return null;
        }
    }

    public void put(K key, V val) {
   
        if (cache.containsKey(key)) {
   
            cache.remove(key);
        } else if (cache.size() >= capacity) {
   
            Iterator itr = cache.keySet().iterator();
            cache.remove(itr.next()); // 删除头
        }
        cache.put(key, val);
    }

}

2、使用HashMap + LinkedList

  • HashMap存储K-V元素
  • LinkedList按序存储key
import java.util.HashMap;
import java.util.LinkedList;

/**
 * @description:
 * @Author: JachinDo
 * @Date: 2020/04/24 22:04
 */

public class LRUCache2<K, V> {
   

    private HashMap<K, V> map;
    private LinkedList<K> list;
    private int capacity;

    public LRUCache2(int capacity) {
   
        map = new HashMap<>();
        list = new LinkedList<K>();
        this.capacity = capacity;
    }

    public V get(K key) {
   
        if (map.containsKey(key)) {
   
            V val = map.get(key);
            list.remove(key); // 更新<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值