LinkedHashMap使用LRU
程序员文章站
2024-03-18 12:39:10
...
目录
hashmap无序的,linkedhashmap可以通过链表实现有序。
像redis lru过期算法,最近最少使用的会删除掉。
简单的实现
import com.alibaba.fastjson.JSON;
import lombok.Data;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class test1 {
public static void main(String[] args) {
test test=new test1.test(2);
test.put("1","1");
test.put("2","2");
Set<Map.Entry<String, String>> set = test.entrySet();
Iterator<Map.Entry<String, String>> iterator = set.iterator();
while(iterator.hasNext()) {
Map.Entry entry = iterator.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
System.out.println("key:" + key + ",value:" + value);
}
System.out.println(JSON.toJSONString(test));
test.get("1");
test.put("3","3");
// System.out.println(JSON.toJSONString(test));
Set<Map.Entry<String, String>> set1 = test.entrySet();
Iterator<Map.Entry<String, String>> iterator1 = set1.iterator();
while(iterator1.hasNext()) {
Map.Entry entry = iterator1.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
System.out.println("key:" + key + ",value:" + value);
}
}
@Data
static class test extends LinkedHashMap {
int SIZE;
test(int size) {
super((int) Math.ceil(size / 0.75) + 1, 0.75f, false);
SIZE = size;
}
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > SIZE;
}
}
}
初始化
super((int) Math.ceil(size / 0.75) + 1, 0.75f, false);
最后一个参数:
默认false,即按照插入顺序显示
true的话,会按照访问顺序排序,在get函数
public V get(Object key) {
Node<K,V> e;
if ((e = getNode(hash(key), key)) == null)
return null;
if (accessOrder)
afterNodeAccess(e);
return e.value;
}
afterNodeAccess就是将访问node节点放在最后。
重写方法
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > SIZE;
}
在put操作中会调用
void afterNodeInsertion(boolean evict) { // possibly remove eldest
LinkedHashMap.Entry<K,V> first;
if (evict && (first = head) != null && removeEldestEntry(first)) {
K key = first.key;
removeNode(hash(key), key, null, false, true);
}
}
大体思路是get方法会把node节点放到最后,put方法会去判断是否打开了设置,是的话删除头hear。从而实现最近最少使用的内存淘汰LRU机制
下一篇: 队列(Queue)C语言实现 详解