一:概述
LinkedHashMap 这个类我是因为在mybatis缓存源码的 LruCache 类中看到了他,对他不解,就跟踪进去看了下。所以,这篇的内容,只会是为了解决
LruCache 中removeEldestEntry方法 最老的元素 是如何来的来展开说。
因为我想知道。在这个LinkedHashMap 中。最少被访问的数据是怎么来的,我就开始了看代码和做数据调试。
这是我的测试数据
package com.llr.reflect.test;
import java.util.LinkedHashMap;
public class LinkedHashMapTest {
public static void main(String[] args) {
LinkedHashMap<Object,String> linkedHashMap= new LinkedHashMap<Object, String>(100, .75F, true) {
};
linkedHashMap.put("1","2");
linkedHashMap.put("2","3");
linkedHashMap.put("3","3");
linkedHashMap.put("4","3");
System.out.println(linkedHashMap.get("2"));
System.out.println(linkedHashMap.get("1"));
System.out.println(linkedHashMap.get("1"));
}
}
这是put的调用。里面先是调用hashMap的put方法,最终也会调用到子类的afterNodeInsertion 方法
当4个元素都put完 之后,map是这个样子的
现在使用System.out.println(linkedHashMap.get("2")); afterNodeAccess 进行了链的重置和排序
现在使用System.out.println(linkedHashMap.get("1")); afterNodeAccess 进行了链的重置和排序
二: 从上面的测试结果可以看出来。LinkedHashMap 类中的 afterNodeAccess 可以把链重新排序,并且找到最少被使用的放到最前面的 head 属性中。
由此我们知道,head中是存放了最少被访问的key,那么下一步,看下这个head 到底和那个 LinkedHashMap 的 removeEldestEntry方法有啥关系。
看到没,head赋值给了first。并且调用了removeEldestEntry方法,由此,我们知道。
removeEldestEntry方法的入参。就是最少被使用的键值对象。至于removeEldestEntry 方法在源码中返回的是false,那么我们可以重新这个方法,当满足我们什么条件的时候,我们就返回true。
我不知道我的表达你们能不能看懂。但是我是真的很水。我都自己弄明白了。相信你也懂了。嘻嘻~
三: 总结
有问题的时候,需要多思考。不要放弃。不要放弃!