1.LRU(最近最少被使用):使用LinkedHashMap算***优先淘汰不长时间使用的数据。(可以理解为是一种磁盘的缓存,对于磁盘而言,内存显然离我们更近些。)

2.首先linkedHashMap中的构造器有成员变量accessOrder,常见的构造器中大部分为默认值,也有构造器可以修改默认值为true,会维护linkedHashMap维护的链表,实现LRU;

3.大致的流程就是,在get方法获取时,会判断accessOrder,如果是true就会使用afterNodeAccess; alt

alt

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删除一个年纪比较大的元素,
    }
}