用java实现缓存算法LFU,固定缓存只有10的长度,并测试淘汰数据使用
时间: 2024-03-14 10:43:15 浏览: 60
好的,我可以帮您回答这个问题。
首先,LFU缓存算法(Least Frequently Used,最少使用次数)是一种常见的缓存淘汰算法,其主要思路是淘汰缓存中使用频率最小的数据。下面是用Java实现LFU缓存算法的示例代码,固定缓存长度为10:
```java
import java.util.HashMap;
import java.util.Map;
public class LFUCache<K, V> {
private Map<K, CacheNode> cache;
private int capacity;
private int minFrequency;
public LFUCache(int capacity) {
this.capacity = capacity;
cache = new HashMap<>();
}
public V get(K key) {
CacheNode node = cache.get(key);
if (node == null) {
return null;
}
node.frequency++;
if (node.frequency > minFrequency) {
minFrequency = node.frequency;
}
return node.value;
}
public void put(K key, V value) {
if (capacity <= 0) {
return;
}
CacheNode node = cache.get(key);
if (node != null) {
node.value = value;
node.frequency++;
if (node.frequency > minFrequency) {
minFrequency = node.frequency;
}
} else {
if (cache.size() >= capacity) {
evict();
}
node = new CacheNode(key, value);
cache.put(key, node);
minFrequency = 1;
}
}
private void evict() {
CacheNode minNode = null;
for (CacheNode node : cache.values()) {
if (minNode == null || node.frequency < minNode.frequency) {
minNode = node;
}
}
cache.remove(minNode.key);
}
private class CacheNode {
K key;
V value;
int frequency = 1;
CacheNode(K key, V value) {
this.key = key;
this.value = value;
}
}
}
```
这段代码中,我们使用了一个HashMap来保存缓存数据,同时还保存了每个缓存数据的访问次数(即frequency),通过比较访问次数来选择淘汰哪些数据。
接下来,我们可以编写一个简单的测试类来测试这个LFU缓存算法的效果:
```java
public class LFUCacheTest {
public static void main(String[] args) {
LFUCache<Integer, Integer> cache = new LFUCache<>(10);
for (int i = 1; i <= 20; i++) {
cache.put(i, i);
}
System.out.println(cache.get(10)); // 10
System.out.println(cache.get(15)); // 15
System.out.println(cache.get(5)); // 5
System.out.println(cache.get(12)); // 12
System.out.println(cache.get(1)); // null
System.out.println(cache.get(2)); // null
}
}
```
在这个测试中,我们向缓存中添加了20个数据,然后分别访问了一些数据,最后输出了一些数据的访问结果。可以看到,我们只能缓存10个数据,当超过10个数据时,会根据访问次数淘汰一些数据。在这个测试中,我们可以看到,访问次数较少的数据(如1和2)被淘汰了,而访问次数较多的数据(如10和15)被保留下来了。
希望这个示例代码和测试能够帮助您理解LFU缓存算法的实现和使用。
阅读全文