jdk源码阅读-》LinkedHashMap类源码解读

一:概述

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。

我不知道我的表达你们能不能看懂。但是我是真的很水。我都自己弄明白了。相信你也懂了。嘻嘻~

三: 总结

有问题的时候,需要多思考。不要放弃。不要放弃!

猜你喜欢

转载自blog.csdn.net/lileronglilerong/article/details/113871176