Java手写原生的LRU算法

Posted 泡^泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java手写原生的LRU算法相关的知识,希望对你有一定的参考价值。

LRU定义

LRU的全称为Least Recently Used,翻译出来就是最近最少使用的意思。它是一种内存淘汰算法,当内存不够时,将内存中最久没使用的数据清理掉。LRU算法常用于缓存的淘汰策略。这里使用链表举例,链表的头部表示最久没有被访问的数据,链表的尾部表示最近刚访问的数据。

案例

import java.util.HashMap;
import java.util.Map;

class LRUCache 
    private class CacheNode 
        CacheNode prev;
        CacheNode next;
        int key;
        int value;
        public CacheNode(int key, int value) 
            this.key = key;
            this.value = value;
            this.prev = null;
            this.next = null;
        
    
    
    private int capacity;
    private Map<Integer, CacheNode> valNodeMap = new HashMap();
    private CacheNode head = new CacheNode(-1, -1);
    private CacheNode tail = new CacheNode(-1, -1);

    public LRUCache(int capacity) 
        this.capacity = capacity;
        tail.prev = head;
        head.next = tail;
    
    
    public int get(int key) 
        if (!valNodeMap.containsKey(key)) 
            return -1;
        
        CacheNode current = valNodeMap.get(key);
        current.prev.next = current.next;
        current.next.prev = current.prev;
        moveToTail(current);
        return valNodeMap.get(key).value;
    
    
    public void put(int key, int value) 
        if (get(key) != -1) 
            valNodeMap.get(key).value = value;
            return;
        
        
        if (valNodeMap.size() == capacity) 
            valNodeMap.remove(head.next.key);
            head.next = head.next.next;
            head.next.prev = head;
        
    
        CacheNode insert = new CacheNode(key, value);
        valNodeMap.put(key, insert);
        moveToTail(insert);
    
    
    private void moveToTail(CacheNode current) 
        current.prev = tail.prev;
        tail.prev = current;
        current.prev.next = current;
        current.next = tail;
    

测试添加

期望效果:添加4以后,1被移除

public class LRUCacheTest 
    public static void main(String[] args) 
        LRUCache lruCache = new LRUCache(3);
        lruCache.put(1,1);
        lruCache.put(2,2);
        lruCache.put(3,3);
        lruCache.put(4,4);
        System.out.println();
    

测试查询

期望效果:被访问的移动到尾部

以上是关于Java手写原生的LRU算法的主要内容,如果未能解决你的问题,请参考以下文章

手写一个 Redis LruCache 缓存机制

面试题目:手写一个LRU算法实现

面试官说,听说你了解Redis,手写一个LRU算法吧

算法Java手写实现栈

算法Java手写实现栈

HashMap+双向链表手写LRU缓存算法/页面置换算法