java - LinkedHashMap 实现 LRU
mybatis缓存:
从数据查询数据时,会把结果放入缓存池。
在没有对这个表进行修改操作时,调用同一个方法时,相同查询语句会直接读取缓存池中的结果。
当缓存池满时,会把最近没有被使用的缓存中的数据覆盖掉。(LRU least recently used);
其中主要使用了linkedHashMap
仿照mybatis中的原理,可以自己利用LinkedHashMap写一个LRU算法。
import java.util.*; public class test { public static void main(String[] arg){ testLinkedHashMap(); } public static void testLinkedHashMap() { LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(5,0.75F ,true){ //第三个参数设为true时,在被使用时会把被使用的数据放到结尾。 @Override protected boolean removeEldestEntry(Map.Entry<String, String> var){ //该方法原本是默认返回false,会在put之后被执行,重写该方法,在数据多于某个值时,返回true,删除头结点。 if(this.size() > 5){ return true; } return false; } }; map.put("aa", "1"); map.put("bb", "2"); map.put("cc", "3"); map.put("dd", "4"); System.out.println(map); map.get("cc"); System.out.println("=================使用cc=================="); System.out.println(map); map.get("bb"); System.out.println("=================使用bb==================="); System.out.println(map); map.put("ee","5"); System.out.println("=================加入ee==================="); System.out.println(map); map.put("ff","6"); System.out.println("=================加入ff==================="); System.out.println(map); } void print(LinkedHashMap<String, String> source) { source.keySet().iterator().forEachRemaining(System.out::println); } }
执行结果
{aa=1, bb=2, cc=3, dd=4}
=================使用cc==================
{aa=1, bb=2, dd=4, cc=3}
=================使用bb===================
{aa=1, dd=4, cc=3, bb=2}
=================加入ee===================
{aa=1, dd=4, cc=3, bb=2, ee=5}
=================加入ff===================
{dd=4, cc=3, bb=2, ee=5, ff=6}