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算法的主要内容,如果未能解决你的问题,请参考以下文章