用Java实现一个Lru算法
时间: 2024-02-09 14:12:13 浏览: 81
FIFO与LRU 算法实现(java).rar_FIFO Java_LRU_fifo
好的,下面是使用Java实现Lru算法的示例代码。
Lru算法的核心是维护一个有序的缓存,每次访问缓存时,将访问的缓存项移到最前面,并删除最后一个缓存项。在Java中,我们可以使用双向链表和哈希表来实现这个有序缓存。
以下是一个简单的Java实现:
```java
import java.util.HashMap;
import java.util.Map;
public class LruCache<K, V> {
class Node {
K key;
V value;
Node prev;
Node next;
Node(K key, V value) {
this.key = key;
this.value = value;
}
}
private final int capacity;
private final Map<K, Node> map = new HashMap<>();
private Node head;
private Node tail;
public LruCache(int capacity) {
this.capacity = capacity;
}
public V get(K key) {
Node node = map.get(key);
if (node != null) {
remove(node);
add(node);
return node.value;
}
return null;
}
public void put(K key, V value) {
Node node = map.get(key);
if (node != null) {
node.value = value;
remove(node);
add(node);
} else {
if (map.size() == capacity) {
map.remove(tail.key);
remove(tail);
}
node = new Node(key, value);
add(node);
map.put(key, node);
}
}
private void add(Node node) {
if (head == null) {
head = node;
tail = node;
} else {
node.next = head;
head.prev = node;
head = node;
}
}
private void remove(Node node) {
if (node == head) {
head = node.next;
if (head != null) {
head.prev = null;
}
} else if (node == tail) {
tail = node.prev;
if (tail != null) {
tail.next = null;
}
} else {
node.prev.next = node.next;
node.next.prev = node.prev;
}
}
}
```
这个LruCache类使用了双向链表和哈希表来维护一个有序缓存,每次访问缓存时,将访问的缓存项移到最前面,并删除最后一个缓存项。在put方法中,如果缓存中已经存在该缓存项,则更新缓存项的值,并将其移到最前面,否则,如果缓存已满,则删除最后一个缓存项,并将新的缓存项添加到最前面。
示例代码:
```java
LruCache<String, Integer> cache = new LruCache<>(2);
cache.put("a", 1);
cache.put("b", 2);
System.out.println(cache.get("a")); // 1
cache.put("c", 3);
System.out.println(cache.get("b")); // null
cache.put("d", 4);
System.out.println(cache.get("a")); // null
System.out.println(cache.get("c")); // 3
System.out.println(cache.get("d")); // 4
```
在上面的示例中,我们创建了一个容量为2的LruCache,向其中添加了三个缓存项,当缓存项数量超过容量时,会自动删除最近最少使用的缓存项,所以最终缓存中只剩下了"c"和"d"。
阅读全文