simple java code for LRU page replacement
时间: 2024-10-23 14:12:41 浏览: 12
lru.rar_LRU_LRU page replacement_lru 算法_页面替换_页面替换算法
LRU (Least Recently Used) 页面替换算法是一种常用的缓存淘汰策略,用于管理内存中的数据页面。在Java中实现LRU并不直接内置在语言标准库中,但可以通过自定义数据结构或使用现成的第三方库来模拟。以下是一个简单的Java代码示例,使用HashMap和双向链表来构建一个基本的LRU缓存:
```java
import java.util.HashMap;
import java.util.Map;
// 定义一个Page类表示内存页
class Page {
int id;
boolean isFreed; // 标记是否已被释放
public Page(int id) {
this.id = id;
this.isFreed = false;
}
}
// LRUCache类,使用HashMap存储键值对,双端队列维护访问顺序
class LRUCache<K, V> {
private final int capacity;
private Map<K, Node<K, V>> cache;
private Deque<Node<K, V>> deque;
// 使用泛型Node类
static class Node<K, V> {
K key;
V value;
Page page;
Node<K, V> prev;
Node<K, V> next;
public Node(K key, V value, Page page) {
this.key = key;
this.value = value;
this.page = page;
}
}
public LRUCache(int capacity) {
this.capacity = capacity;
cache = new HashMap<>();
deque = new LinkedList<>();
}
public V get(K key) {
if (!cache.containsKey(key)) return null;
Node<K, V> node = cache.get(key);
moveToFront(node);
return node.value;
}
public void put(K key, V value) {
if (cache.size() >= capacity) {
removeOldest();
}
Node<K, V> newNode = new Node<>(key, value, new Page());
cache.put(key, newNode);
addToFront(newNode);
}
private void moveToFront(Node<K, V> node) {
if (deque.remove(node)) {
deque.addFirst(node);
}
}
private void removeOldest() {
Node<K, V> oldestNode = deque.getLast();
cache.remove(oldestNode.key);
oldestNode.page.isFreed = true;
}
private void addToFront(Node<K, V> newNode) {
newNode.prev = null;
newNode.next = deque.getFirst();
if (newNode.next != null) newNode.next.prev = newNode;
deque.addFirst(newNode);
}
}
```
这个简单的LRU实现适用于小规模的数据和内存限制。如果你处理大规模数据或者需要高性能的实现,可能需要考虑使用专门设计的LRU数据结构库,如Guava Cache等。
阅读全文