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。

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

三: 总结

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值