put/get/peek
public class Lrup {
//FiFO结构:容量capital和链表linkedHashMap,参数内部使用不用加private
int capital;
LinkedHashMap<Integer,Integer> cache;
//只需要容量参数
public Lrup(int capital) {
this.cache=new LinkedHashMap<>();
this.capital = capital;
}
//主要是put和get的两个方法,peek获取栈顶不改变链表顺序
public void put(int key,int value){
//hashMap对重复key的去重处理,先去重FO
if (cache.containsKey(key)) {
cache.remove(key);
}
//加上capital2,FO执行,123传入,去掉1,剩23
//当capital=2,cache.size=2, 迭代器获取next第一个数据,remove掉
if (cache.size()==capital) {
//获取First
Iterator<Integer> iterator = cache.keySet().iterator();
cache.remove(iterator.next());
}
//最后put
cache.put(key,value);
}
public int get(int key){
//不包含的key返回-1
if (!cache.containsKey(key)) {
return -1;
}
Integer value = cache.get(key);
//由于LRU是最新的缓存,在get之后。获取的数据也应该存在链表的末尾
//把get的数据存在链表的结尾
cache.remove(key);
cache.put(key,value);
return value;
}
public int peek() {
return cache.get(cache.entrySet().iterator().next().getKey());
}
}
class Run{
public static void main(String[] args) {
Lrup lrup = new Lrup(2);
lrup.put(1,1);
lrup.put(2,2);
lrup.put(3,3);
System.out.println("lrup.get(2) = " + lrup.get(2));
System.out.println("lrup.get(1) = " + lrup.get(1));
LinkedHashMap<Integer, Integer> cache = lrup.cache;
for (Map.Entry<Integer, Integer> integerIntegerEntry : cache.entrySet()) {
System.out.println(integerIntegerEntry);
}
System.out.println("lrup.peek() = " + lrup.peek());
}
}