使用LinkedHashMap是有序的,并且查找的效率可以达到O(1),所以使用LinkedHashMap()来实现lru,还是很方便的
大致思路: 首先标记元素长度n,初始为0,如果要换入2,先map.get(2)不存在且map的元素个数小于 块数,则放入map中,n++
如果map中有这个元素,那么则删除,在放入;
package com.jdk8.newpat;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
public class Lru {
public static void main(String[] args) {
Map<Integer, Integer> map = new LinkedHashMap<>();
int n = 3;// 块数
int count = 0;// 中断次数
int lenth = 0;// map元素个数
int[] arr = { 3, 4, 3, 1, 2 };
for (int i = 0; i < arr.length; i++) {
//不到n个
if (lenth < n && map.get(arr[i]) == null) {
map.put(arr[i], 0);
lenth++;
count++;
continue;
}
//n个后要移除置换
if (map.get(arr[i]) == null) {
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
while(it.hasNext()) {
it.next();
it.remove();
break;
}
/*for (Integer one : map.keySet()) {
map.remove(one);
break;
}*/
map.put(arr[i], 0);
count++;
continue;
}
if (map.get(arr[i]) != null) {
map.remove(arr[i]);
map.put(arr[i], 0);
continue;
}
}
for (Map.Entry<Integer, Integer> one : map.entrySet()) {
System.out.println(one.getKey());
}
System.out.println("count:" + count);
}
}