Java实现LRU缓存

这里写目录标题

  • LRU 缓存
    • 解法一
    • Bug思路

LRU 缓存

Java实现LRU缓存_第1张图片

Java实现LRU缓存_第2张图片

LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。

  • 双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。

  • 哈希表即为普通的哈希映射(HashMap),通过缓存数据的键映射到其在双向链表中的位置。

这样以来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1)O(1) 的时间内完成 get 或者 put 操作。具体的方法如下:

  • 对于 get 操作,首先判断 key 是否存在:
  1. 如果 key 不存在,则返回 −1;

  2. 如果 key 存在,则 key 对应的节点是最近被使用的节点。通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。

Java实现LRU缓存_第3张图片
Java实现LRU缓存_第4张图片

解法一

public class LRUCache {
   
    class DLinkedNode {
   
        int key;
        int value;
        DLinkedNode prev;
        DLinkedNode next;
        public DLinkedNode() {
   }
        public DLinkedNode(int _key, int _value) {
   key = _key; value = _value;}
    }

    private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();
    private int size;
    private int capacity;
    private 

你可能感兴趣的:(数据结构和算法,缓存,java,链表)