Java实现一个LRU
时间: 2024-02-09 13:09:56 浏览: 154
LRU(Least Recently Used)是一种缓存淘汰策略,指的是将最近最少使用的数据从缓存中淘汰掉。下面是Java实现一个LRU算法的示例代码:
```java
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
// 缓存容量
private int capacity;
public LRUCache(int capacity) {
// 设置accessOrder为true,表示按访问顺序排序
super(capacity, 0.75f, true);
this.capacity = capacity;
}
// 重写removeEldestEntry方法,当缓存大小超过容量时,移除最近最少使用的数据
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
```
这里使用了Java内置的LinkedHashMap数据结构,它本身就支持按照访问顺序排序。重写了removeEldestEntry方法,当缓存大小超过容量时移除最近最少使用的数据。通过这种方式实现了LRU算法。
相关问题
用Java实现一个Lru
好的,我可以帮你实现一个Java版的Lru缓存。
Lru(Least Recently Used)缓存是一种常见的缓存策略,它会删除最近最少使用的缓存项。在Java中,我们可以使用LinkedHashMap来实现一个Lru缓存,因为LinkedHashMap本身就是一个有序的Map,而且可以通过覆写removeEldestEntry方法来实现自动删除最近最少使用的缓存项。
以下是一个简单的Java实现:
```java
import java.util.LinkedHashMap;
import java.util.Map;
public class LruCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
public LruCache(int capacity) {
super(capacity, 0.75f, true);
this.capacity = capacity;
}
@Override
public boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
```
这个LruCache类继承自LinkedHashMap,并覆写了removeEldestEntry方法,当缓存项数量超过capacity时,就会自动删除最近最少使用的缓存项。我们可以使用put方法向缓存中添加缓存项,使用get方法获取缓存项,使用size方法获取缓存项数量。
示例代码:
```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"。
用Java实现一个Lru算法
好的,下面是使用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"。
阅读全文