LRU算法 java
时间: 2023-11-25 18:48:52 浏览: 78
LRU算法是一种缓存淘汰策略,它是大部分操作系统为最大化页面命中率而广泛采用的一种页面置换算法。该算法的思路是,发生缺页中断时,将最近一段时间内最久未使用的页面置换出去。Java实现LRU算法的代码可以通过引用中的资源获取。该资源可以根据页面序号和进程分配的模块数,运行出具体的变化过程,真实可靠,可实现。
相关问题
生成lru算法Java代码
好的,我可以回答这个问题。以下是一个简单的 LRU 算法的 Java 代码实现:
```
import java.util.HashMap;
import java.util.Map;
public class LRUCache<K, V> {
private final int capacity;
private final Map<K, Node<K, V>> cache;
private Node<K, V> head;
private Node<K, V> tail;
public LRUCache(int capacity) {
this.capacity = capacity;
cache = new HashMap<>(capacity);
}
public V get(K key) {
Node<K, V> node = cache.get(key);
if (node == null) {
return null;
}
moveToHead(node);
return node.value;
}
public void put(K key, V value) {
Node<K, V> node = cache.get(key);
if (node == null) {
node = new Node<>(key, value);
cache.put(key, node);
addToHead(node);
if (cache.size() > capacity) {
removeTail();
}
} else {
node.value = value;
moveToHead(node);
}
}
private void addToHead(Node<K, V> node) {
if (head == null) {
head = node;
tail = node;
} else {
node.next = head;
head.prev = node;
head = node;
}
}
private void removeNode(Node<K, V> node) {
if (node == head) {
head = node.next;
} else if (node == tail) {
tail = node.prev;
} else {
node.prev.next = node.next;
node.next.prev = node.prev;
}
}
private void moveToHead(Node<K, V> node) {
removeNode(node);
addToHead(node);
}
private void removeTail() {
cache.remove(tail.key);
if (tail == head) {
tail = null;
head = null;
} else {
tail = tail.prev;
tail.next = null;
}
}
private static class Node<K, V> {
private final K key;
private V value;
private Node<K, V> prev;
private Node<K, V> next;
public Node(K key, V value) {
this.key = key;
this.value = value;
}
}
}
```
这个类实现了一个 LRU 缓存,使用双向链表和哈希表来实现。它有两个主要的方法:`get` 和 `put`。`get` 方法根据给定的键返回缓存中对应的值,如果缓存中没有该键,则返回 null。`put` 方法将给定的键值对添加到缓存中,如果缓存已满,则删除最近最少使用的键值对。
LRU算法java代码实现
LRU (Least Recently Used) 算法是一种常用的缓存淘汰策略,它会优先移除最近最少使用的数据项。在 Java 中,可以使用 LinkedHashMap 数据结构来实现 LRU 功能,因为 LinkedHashMap 已经内置了对访问顺序的维护。
以下是一个简单的 Java 实现 LRU 算法的例子:
```java
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> {
private final int capacity;
private final Map<K, Node<K, V>> cache = new LinkedHashMap<>(capacity, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K, Node<K, V>> eldest) {
return size() > capacity;
}
};
public class Node<K, V> {
K key;
V value;
Node<K, V> prev, next;
public Node(K key, V value) {
this.key = key;
this.value = value;
}
}
public V get(K key) {
Node<K, V> node = cache.get(key);
if (node == null) {
return null;
} else {
// 将访问过的节点移动到链表头部
moveToHead(node);
return node.value;
}
}
public void put(K key, V value) {
cache.put(key, new Node<>(key, value));
}
private void moveToHead(Node<K, V> node) {
if (node.prev != null) {
node.prev.next = node.next;
}
if (node.next != null) {
node.next.prev = node.prev;
} else {
cache.putFirst(node); // 如果是头结点
}
node.prev = null;
node.next = cache.first();
}
}
```
在这个例子中,`LinkedHashMap` 的构造函数设置了第二个参数为 0.75f 和第三个参数为 true,这意味着加载因子是 0.75,当缓存满时,最久未使用的元素会被移除。`removeEldestEntry` 方法是自定义的,它会在添加新元素时检查是否需要移除最旧的元素。
阅读全文