1.LRU(最近最少被使用):使用LinkedHashMap算***优先淘汰不长时间使用的数据。(可以理解为是一种磁盘的缓存,对于磁盘而言,内存显然离我们更近些。)
2.首先linkedHashMap中的构造器有成员变量accessOrder,常见的构造器中大部分为默认值,也有构造器可以修改默认值为true,会维护linkedHashMap维护的链表,实现LRU;
3.大致的流程就是,在get方法获取时,会判断accessOrder,如果是true就会使用afterNodeAccess;
4.linkedHashMap实现LRU:(linkedHashMap中有一个方法removeEldestEntry(),这个方法默认的返回值是false,并且是使用protected修饰,需要子类重写这个方法;)
5.实现的LRU:
import java.util.LinkedHashMap;
import java.util.Map;
public class LRU<k,v> extends LinkedHashMap<k,v> {
public LRU(int initialCapacity) {
super(initialCapacity, 0.75F, true);
}
public LRU() {
super(16, 0.75F, true);
}
@Override
protected boolean removeEldestEntry(Map.Entry<k, v> eldest) {
return size() > 5;
}
}
package com.ydlclass.collection;
import java.util.*;
public class LinkeHashMapTest {
public static void main(String[] args) {
//Map<String,Integer> linkHMap = new LinkedHashMap<String,Integer>(16,0.75F,true);//数据量比较大的时候,hashMap是无序的但是LinkedHashMap是有序的;
Map<String,Integer> linkHMap = new LRU<>();//此时使用LRU时linkedHashMap中只能存储固定的长度;
linkHMap.put("a",1);
linkHMap.put("b",2);
linkHMap.put("c",3);
linkHMap.put("d",4);
linkHMap.put("e",5);
linkHMap.put("f",6);
linkHMap.put("g",7);
linkHMap.put("fg",8);
linkHMap.put("gh",9);
//linkHMap.get("a");//可以发现使用指定的构造器,插入的元素素,会默认的放在链表的尾部;
//linkHMap.put("aa",0);//之后新加入的元素会放在之前元素的前面;说明了不被访问的元素会慢慢的放在链表的头部
linkHMap.get("g");
Set<Map.Entry<String, Integer>> entries = linkHMap.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
for (;iterator.hasNext();){
Map.Entry<String, Integer> next = iterator.next();
System.out.println(next.getKey() + " = " + next.getValue().toString());
}
//普通的这种方式不会导致LinkedHashMap删除一个年纪比较大的元素,
}
}