学Java第四十四天——Map实现类的源码解析

一、基础知识

在某个类的界面按快捷键:CTRL+F12

圈m代表方法,后面是:方法名、参数、返回值类型,

再后面的向上箭头⬆代表:该方法是重写⬆后的那个类or接口 的。

灰色的方法是直接继承后面➡那个类的,没有重写。因为重写了,所以继承父类的方法就无效了,变成灰色了。

黄色的圈 f 代表一个类的属性field,包括成员变量和常量

绿色圈 I 是接口,蓝色圈 c 是内部类

二、HashMap源码解析


put方法的源码解析:




1、添加第一个元素&添加的元素位置没有其他元素:

  1. 无参构造方法:不会创建一个数组,只会得到一个加载因子,此时数组是null
  2. 当put()第一个元素时,才会创建数组,数组的地址此时才不是null
  3. put()里面调用了putval()
  4. putval()里面:先判断是否table为null,如果是,就先resize(),返回一个16长度的数组给table,之后计算这次添加put的元素(key,value)的索引,判断该索引位置是否有其他元素,没有的话,就把该元素(key,value)先创建一个节点对象并添加到该索引上。

成员变量是保存在堆内存中,成员方法里面的局部变量是保存在栈内存中。所以一般会在成员方法里面再定义一个和成员变量同名的局部变量,方便存取,效率高

resize():

2、添加的位置有元素,但是键不相同,不用覆盖,直接挂在下面,

挂在下面形成链表,用到了一个循环,一直判断那个索引位置上的链的元素key是否与要添加的key相同,不相同+循环到链的末尾,就把元素添加上去。e最后是null

3、找到相同key了,要覆盖

如果发现在循环的过程中找到了键相同的键值对,那就跳出循环。此时 变量e 代表与要添加的元素key一样的元素。 e如果有值,就代表有相同key的元素,要覆盖;e如果是null,说明没有相同的key,就添加元素到末尾。

三、TreeMap源码解析

entry键值对对象所属Entry类

每个entry对象包含的属性有哪些:键、值、颜色、父节点、左右孩子节点

;Entry类是TreeMap类的内部类

TreeMap类包含成员变量、构造方法、成员方法

TreeMap成员变量有根节点root的地址值、比较器、树的节点个数

put方法

1、添加第一个元素

给root赋值一个entry对象,size设为1

2、添加第二、三、四......个元素

  1. 先找到要插入哪个节点的后面,其实就是通过循环遍历null找到parent------>>put()
  2. 找到要添加的元素是左孩子节点还是右孩子节点,真正的添加节点------>>>addEntry()
  3. 满足红黑树规则------>>>fixAfterInsertion()
2.1put()
2.2addEntry()
2.3fixAfterInsertion()

四、最后的思考

相关推荐
charlie1145141912 分钟前
嵌入式C++工程实践第20篇:GPIO 输入模式内部电路 —— 芯片是如何“听“到外部信号的
开发语言·c++·stm32·单片机
消失的旧时光-19434 分钟前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
NE_STOP13 分钟前
Redis--发布订阅命令和Redis事务
java
PAC_3Dame18 分钟前
记一次真实的线上OOM
java
xinhuanjieyi25 分钟前
极语言让ai学习的方法
开发语言·学习
SunnyDays101136 分钟前
如何在Java中将Word文档转换为图像(JPEG、PNG或SVG)
java
xiaogutou112140 分钟前
2026年历史课件PPT模板选购指南:教师备课效率与精度的平衡方案
开发语言·c#
Lumos_7771 小时前
Linux -- 线程
java·jvm·算法
知兀1 小时前
【MybatisPlus】后端用枚举类,数据库用tinyint,存在枚举类型转换
java
StockTV1 小时前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python