LinkedHashMap LRU 实现

Posted silyvin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinkedHashMap LRU 实现相关的知识,希望对你有一定的参考价值。

package lru;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

/**
* Created by sunyuming on 19/7/15.
*/
public class LRUMain
public static void main(String [] flag)

LRUCache<String, Integer> lruCache = new LRUCache<String,Integer>(10);

for(int i=0; i<10; ++i)
System.out.println("put "+i);
lruCache.put(String.valueOf(i), i);


for(int i=9; i>=0; --i)
System.out.println("get "+i);
lruCache.get(String.valueOf(i));


// 触发
System.out.println("put "+ "chufa");
lruCache.put("chufa", 0);

Iterator<Map.Entry<String, Integer>> iterator= lruCache.entrySet().iterator();

while(iterator.hasNext())

Map.Entry entry = iterator.next();
System.out.println(entry.getKey()+":"+entry.getValue());


for (Map.Entry<String, Integer> entry : lruCache.entrySet())
System.out.println(entry.getKey()+":"+entry.getValue());


System.out.println();



private static class LRUCache<K, V> extends LinkedHashMap<K, V>
private int CACHE_SIZE;

public LRUCache(int cashSize)
super(cashSize*2, 0.75f, true);
CACHE_SIZE = cashSize;


@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest)
System.out.println("可能触发删除 - " + eldest.getKey()+":"+eldest.getValue());
System.out.println("可能触发删除 - " + size() + " " + CACHE_SIZE);
if(size() > CACHE_SIZE)
System.out.println("触发删除 " + size() + " " + CACHE_SIZE);

return size() > CACHE_SIZE;





输出:

put 0
可能触发删除 - 0:0
可能触发删除 - 1 10
put 1
可能触发删除 - 0:0
可能触发删除 - 2 10
put 2
可能触发删除 - 0:0
可能触发删除 - 3 10
put 3
可能触发删除 - 0:0
可能触发删除 - 4 10
put 4
可能触发删除 - 0:0
可能触发删除 - 5 10
put 5
可能触发删除 - 0:0
可能触发删除 - 6 10
put 6
可能触发删除 - 0:0
可能触发删除 - 7 10
put 7
可能触发删除 - 0:0
可能触发删除 - 8 10
put 8
可能触发删除 - 0:0
可能触发删除 - 9 10
put 9
可能触发删除 - 0:0
可能触发删除 - 10 10
get 9
get 8
get 7
get 6
get 5
get 4
get 3
get 2
get 1
get 0
put chufa
可能触发删除 - 9:9
可能触发删除 - 11 10
触发删除 11 10
8:8
7:7
6:6
5:5
4:4
3:3
2:2
1:1
0:0
chufa:0
8:8
7:7
6:6
5:5
4:4
3:3
2:2
1:1
0:0
chufa:0

 

证明:

1 每次put都会调用RemoveEldest~;

2 LinkedHashmap的迭代器与循环两种方式输出次序一样

3 在倒序循环读之前,“0”是第一个写入的,所以是最老的,在读之后,“9”是第一个被读的,所以是最老的,被干掉

以上是关于LinkedHashMap LRU 实现的主要内容,如果未能解决你的问题,请参考以下文章

LinkedHashMap源码分析与LRU实现

java - LinkedHashMap 实现 LRU

LinkedHashMap:我还能实现LRU

LinkedHashMap实现LRU - 附重点源码解析

LinkedHashMap LRU 实现

LinkedHashMap实现LRU缓存算法