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}

posted @ 2020-04-13 11:35  不咬人的兔子  阅读(1353)  评论(0编辑  收藏  举报