java编写LRU算法
Posted 本站大佬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java编写LRU算法相关的知识,希望对你有一定的参考价值。
LRU是什么,如何实现?
最近最少使用策略LRU(Least Recently Used)是一种缓存淘汰算法,是一种缓存淘汰机制。
使用双向链表实现的队列,队列的最大容量为缓存的大小。在使用过程中,把最近使用的页面移动到队列头,最近没有使用的页面将被放在队列尾的位置。
使用一个hashmap,把页号作为键,把缓存在队列中的节点的地址作为值,只需要把这个页对应的节点移动到队列前面,如果需要的页面在内存中,此时需要把这个页面加载到内存中,简单来说,就是将一个新节点添加到队列前面,并在hashmap中更新相应的节点地址,如果队列是满的,那么就从队尾移除一个节点,并将新节点添加到队列的前面。
import java.util.HashMap;
import java.util.Map;
public class MyLRU
// 头节点,尾节点
Entry head,tail;
// 链表当前长度
int size;
// hashmap容量
int capacity;
Map<Integer,Entry> cache;
public MyLRU(int capacity)
// 获取到容量
this.capacity = capacity;
// 初始化链表
initLinkedList();
// 链表起始长度为0
size = 0;
// 定义hashmap
cache = new HashMap<Integer,Entry>(this.capacity);
// Map put
public void put(int key,int value)
Entry node = cache.get(key);
if (node != null)
node.value = value;
moveEntryToHead(node);
if (size == capacity)
Entry tailnode = tail.pre;
deleteTailEntry(tailnode);
cache.remove(tailnode.key);
size--;
Entry newnode = new Entry(key,value);
cache.put(key,newnode);
addHeadEntry(newnode);
size++;
// Map get
public Entry get(int key)
Entry node = cache.get(key);
if (node != null)
moveEntryToHead(node);
return node;
Entry entry = new Entry();
System.out.println(entry.key);
System.out.println(entry.value);
return entry;
// 访问到节点后的操作
public void moveEntryToHead(Entry node)
deleteTailEntry(node);
addHeadEntry(node);
// 删除链表尾部节点
public void deleteTailEntry(Entry node)
node.pre.next = tail;
tail.pre = node.pre;
// 添加链表头部节点
public void addHeadEntry(Entry node)
head.next.pre = node;
node.next = head.next;
node.pre = head;
head.next = node;
// 创建链表
public void initLinkedList()
head = new Entry();
tail = new Entry();
head.next = tail;
tail.pre = head;
// 节点
public static class Entry
public Entry pre;
public Entry next;
public int key;
public int value;
public Entry()
public Entry(int key, int value)
this.key = key;
this.value = value;
public static void main(String[] args)
MyLRU cache = new MyLRU(2);
cache.put(1, 1);
cache.put(2, 2); // 21
System.out.println(cache.get(1).value); // 12
cache.put(3, 3); // 31
System.out.println(cache.get(2).value);
以上是关于java编写LRU算法的主要内容,如果未能解决你的问题,请参考以下文章