活久见的LinkedHashMap

随便聊聊

笔者大三,在2021.1.18入职字节实习生,干了四十天就休假跑路回去上课了。最近一大段时间过的非常松懈,现在报复性疯狂发布博客,哈哈。还是决定阅读JDK源码,从集合开始,希望能够读完核心的集合、AQS、线程池在等部分,最近对Java并发比较感兴趣也比较有体会,鬼知道能不能坚持到那个时候。笔者的文章可能不够详细,但会记录下来个人觉得比较核心的内容。
联系方式:qq 754647431

LinkedHashMap简介

核心原理:

LinkedHashMap的底层结构是:由于继承而产生的HashMap父类|LinkedHashMap自己的双向链表
所以LinkedHashMap只不过是在HashMap的基础上额外维护了一个双向链表罢了,仅此而已
那么问题来了:LinkedHashMap是如何在自己实现一点点方法的基础上,利用到HashMap中呢?
-----实际上是LinkedHashMap重写了HashMap的newNode函数,额外添加了一句话linkNodeLast§;这样就实现了在插入时维护双向链表,但是删除元素非常复杂,需要仔细看源码才行。这里先放下HashMap留给LinkedHashMap的后门方法。

    # 这是HashMap留给LinkedHashMap的后门,// Callbacks to allow LinkedHashMap post-actions// 如果hashmap的节点被更新  则调用该方法void afterNodeAccess(Node<K,V> p) { }// 如果hashmap插入节点   则调用该方法void afterNodeInsertion(boolean evict) { }// 如果hashmap删除节点  则调用该方法void afterNodeRemoval(Node<K,V> p) { }

这是我调试的时候截的图,可以看出,LinkedHashMap按顺序存储了双向链表结构,而HashMap也按hash存储了数据,每个数据都被存储了两次,并且结构体也不同

  1. 我们可以发现LinkedHashMap继承于HashMap,在HashMap已经实现Map接口的情况下,LinkedHashMap仍然实现了Map接口,实现Map接口会要求LinkedHashMap实现所有Map接口的方法。
public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>
  1. 我们可以发现,LinkedHashMap包含的函数非常少,甚至不包含put方法,这是因为LinkedHashMap继承了HashMap的put等方法。
  2. 我们来看看LinkedHashMap如何从HashMap获取数据,来维护自己的双向链表。
  • LinkedHashMap重写了HashMap的newNode方法,每次HashMap需要插入节点的时候都需要newNode函数,这样LinkedHashMap就能够通过linkNodeLast§;来维护双向链表了。
 Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {LinkedHashMap.Entry<K,V> p =new LinkedHashMap.Entry<K,V>(hash, key, value, e);linkNodeLast(p);return p;}

核心维护双向链表的函数

// link at the end of listprivate void linkNodeLast(LinkedHashMap.Entry<K,V> p) {// 获取双向链表尾节点  用来实现尾插LinkedHashMap.Entry<K,V> last = tail;// 尾节点指向新节点tail = p;// 如果双向链表尾空  设置头节点指向新节点  此时头尾都指向新节点if (last == null)head = p;else {// 原尾节点与新节点双向奔赴p.before = last;last.after = p;}}

JDK源码学习04-寄生虫LinkedHashMap相关推荐

  1. JDK源码学习-基础

    JDK源码学习 目录 基础 1. 安装 1.1 下载JDK 1.2 配置环境变量 1.3 验证 2. 简单的程序 2.1 编写代码 2.2 编译文件 2.3 执行类 3. java基本类型 基础 1. ...

  2. JAVA JDK 源码学习

    JAVA JDK 源码学习 ,以1.8为例,按照下面图片顺序依次学习: applet ,awt,beans,io,lang,math,net,nio,rmi,security,sql,text,tim ...

  3. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

  4. JDK源码学习路线~每天学一点~每天进步一点点

    很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起.以下为小编整理的通常所需阅读的源码范围. 标题为包名,后面序号为优先级1-4,优先级递减 1.java.lang 1) Objec ...

  5. 非常实用,IDEA 搭建JDK源码学习环境(可修改+断点+笔记)

    点击关注公众号,实用技术文章及时了解 来源:chenxiao.blog.csdn.net/article/details/104369824 在学习JDK源码的时候,自然少不了代码的调试. 阅读与调试 ...

  6. JDK源码学习笔记——String

    1.学习jdk源码,从以下几个方面入手: 类定义(继承,实现接口等) 全局变量 方法 内部类 2.hashCode private int hash; public int hashCode() {i ...

  7. JDK源码学习之Arraylist与LinkedList

    ArrayList和LinkedList是我们在开发过程中常用的两种集合类,本文将从底层源码实现对其进行简单介绍. 下图是Java集合类所涉及的类图. 一.ArrayList 从上面的集合类图可以看出 ...

  8. JDK源码学习笔记——Enum枚举使用及原理

    一.为什么使用枚举 什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数.一年四季等.或者是在我们编译前就知道其包含的所有值的集合. 利用 public final static 完全可 ...

  9. 通过 JDK 源码学习灵活应用设计模式(上)

    如果大家觉得文章有错误内容,欢迎留言或者私信讨论~   在真实的项目开发中,对于设计模式要学会活学活用,切不可死记硬背,生搬硬套设计模式的设计与实现.需要了解到: 设计的过程是先有问题后有方案的    ...

最新文章

  1. JAVA中获取当前系统时间
  2. 分布式 RPC 框架
  3. iPhone UITextField-更改占位符文本颜色
  4. Putty常用属性设置
  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)重载模板和类型转换
  6. python获取android手机信息
  7. 图像处理/255.0 和/127.5 -1
  8. 从零开始学python人工智能课程_从零开始如何学习人工智能?
  9. 从零开始学习Hadoop--第1章 Hadoop的安装
  10. Oracle使用rman备份数据库时出现cannot reclaim的错误
  11. php 类 和 函数,PHP函数和类
  12. L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT
  13. mui(APP)全屏展示
  14. 【Spring框架】mvc:default-servlet-handler/的作用
  15. java有哪些部分要学_java需要学习哪些知识
  16. vivaldi浏览器_两款可以提升效率的网络浏览器
  17. Wireless基本概念
  18. 第一台计算机英语句子,20个虚拟语气句子带翻译
  19. linux写含输入输出的代码,linux系统管理-输入输出
  20. #数据结构:家谱管理

热门文章

  1. U盘装系统图文教程07-20最新整理分享!
  2. 朱兰的质量三部曲——《可以量化的管…
  3. 软件开发之我剑-----立项报告和需求分析,初出江湖
  4. JAVA学习日记(第三十二天)
  5. 利用条形码系统进行库存管理
  6. 电子MES生产管理系统,车间条码生产管理系统解决方案
  7. mysqldump数据备份
  8. ACQPS计算 AD采样保持电路 DSP2833x
  9. CSV 拆分工具推荐
  10. 不同版本的Oracle客户端支持的数据库版本