JDK源码学习04-寄生虫LinkedHashMap
活久见的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存储了数据,每个数据都被存储了两次,并且结构体也不同
- 我们可以发现LinkedHashMap继承于HashMap,在HashMap已经实现Map接口的情况下,LinkedHashMap仍然实现了Map接口,实现Map接口会要求LinkedHashMap实现所有Map接口的方法。
public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>
- 我们可以发现,LinkedHashMap包含的函数非常少,甚至不包含put方法,这是因为LinkedHashMap继承了HashMap的put等方法。
- 我们来看看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相关推荐
- JDK源码学习-基础
JDK源码学习 目录 基础 1. 安装 1.1 下载JDK 1.2 配置环境变量 1.3 验证 2. 简单的程序 2.1 编写代码 2.2 编译文件 2.3 执行类 3. java基本类型 基础 1. ...
- JAVA JDK 源码学习
JAVA JDK 源码学习 ,以1.8为例,按照下面图片顺序依次学习: applet ,awt,beans,io,lang,math,net,nio,rmi,security,sql,text,tim ...
- JDK源码学习笔记——Integer
一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...
- JDK源码学习路线~每天学一点~每天进步一点点
很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起.以下为小编整理的通常所需阅读的源码范围. 标题为包名,后面序号为优先级1-4,优先级递减 1.java.lang 1) Objec ...
- 非常实用,IDEA 搭建JDK源码学习环境(可修改+断点+笔记)
点击关注公众号,实用技术文章及时了解 来源:chenxiao.blog.csdn.net/article/details/104369824 在学习JDK源码的时候,自然少不了代码的调试. 阅读与调试 ...
- JDK源码学习笔记——String
1.学习jdk源码,从以下几个方面入手: 类定义(继承,实现接口等) 全局变量 方法 内部类 2.hashCode private int hash; public int hashCode() {i ...
- JDK源码学习之Arraylist与LinkedList
ArrayList和LinkedList是我们在开发过程中常用的两种集合类,本文将从底层源码实现对其进行简单介绍. 下图是Java集合类所涉及的类图. 一.ArrayList 从上面的集合类图可以看出 ...
- JDK源码学习笔记——Enum枚举使用及原理
一.为什么使用枚举 什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数.一年四季等.或者是在我们编译前就知道其包含的所有值的集合. 利用 public final static 完全可 ...
- 通过 JDK 源码学习灵活应用设计模式(上)
如果大家觉得文章有错误内容,欢迎留言或者私信讨论~ 在真实的项目开发中,对于设计模式要学会活学活用,切不可死记硬背,生搬硬套设计模式的设计与实现.需要了解到: 设计的过程是先有问题后有方案的 ...
最新文章
- JAVA中获取当前系统时间
- 分布式 RPC 框架
- iPhone UITextField-更改占位符文本颜色
- Putty常用属性设置
- C++ Primer 5th笔记(chap 16 模板和泛型编程)重载模板和类型转换
- python获取android手机信息
- 图像处理/255.0 和/127.5 -1
- 从零开始学python人工智能课程_从零开始如何学习人工智能?
- 从零开始学习Hadoop--第1章 Hadoop的安装
- Oracle使用rman备份数据库时出现cannot reclaim的错误
- php 类 和 函数,PHP函数和类
- L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT
- mui(APP)全屏展示
- 【Spring框架】mvc:default-servlet-handler/的作用
- java有哪些部分要学_java需要学习哪些知识
- vivaldi浏览器_两款可以提升效率的网络浏览器
- Wireless基本概念
- 第一台计算机英语句子,20个虚拟语气句子带翻译
- linux写含输入输出的代码,linux系统管理-输入输出
- #数据结构:家谱管理