java - LinkedHashMap - 实现LRU

一、目的

通过LinkedHashMap实现LRU.

二、概念

LRU - Least Recently Used的缩写,即最近最少使用.

三、核心

利用linkedHashMapremoveEldestEntry()以及accessOrder属性.

removeEldestEntry(): 重新此方法,当条件满足为true时,删除当前map中最老的键值。

accessOrder:
true的时候,将按照操作后的元素放在链表后面放置顺序就是访问顺序.
false的时候,将按照插入顺序来遍历.

四、具体实现

LRU实现类

public class LruTest {
        private LinkedHashMap lruMap;
        private float loadFactory = 0.75f;

        LruTest(int cap) {
            ConditionUtils.notNullWithFormat(cap, InCommonErrorCodeConstants.PARAM_IS_EMPTY, "cap");
            lruMap = new LinkedHashMap(cap, loadFactory, true) {
                /**
                 *  put的时候,将移除map中最老的键和值
                 */
                @Override
                protected boolean removeEldestEntry(Map.Entry eldest) {
                    return super.size() > cap;
                }
            };
        }
        LruTest put(K key, V value) {
            lruMap.put(key, value);
            return this;
        }

        V get(K key){
            return lruMap.get(key);
        }

        Map getMap(){
            return Safes.of(lruMap);
        }
    }

测试方法:

public static void main(String[] args) {
        LruTest lruTest = new LruTest<>(3);
        lruTest.put("1","1");
        lruTest.put("2","2");
        lruTest.put("3","3");
        lruTest.put("4","4");

        System.out.println("测试直接添加的场景,删除第一个节点 : " + JsonMoreUtils.toJson(lruTest.getMap()));
        lruTest.put("2","new2");
        lruTest.put("2","new22");
        lruTest.put("3","new3");
        lruTest.put("5","5");

        System.out.println("测试直接编辑后的场景,删除未使用的key - 【 4 】 : " + JsonMoreUtils.toJson(lruTest.getMap()));
        lruTest.get("5");
        lruTest.get("2");
        lruTest.put("6","6");

        System.out.println("测试访问的场景,删除未访问的key - 【 3 】 : " + JsonMoreUtils.toJson(lruTest.getMap()));
    }

结果:

测试直接添加的场景,删除第一个节点 : {"2":"2","3":"3","4":"4"}
测试直接编辑后的场景,删除未使用的key - 【 4 】 : {"2":"new22","3":"new3","5":"5"}
测试访问的场景,删除未访问的key - 【 3 】 : {"5":"5","2":"new22","6":"6"}

你可能感兴趣的:(java - LinkedHashMap - 实现LRU)