学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()

四、最后的思考

相关推荐
Scott9999HH7 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔7 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社8 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海8 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖9 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区11 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大12 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai12 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说12 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json