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

四、最后的思考

相关推荐
BHXDML12 分钟前
第七章:类与对象(c++)
开发语言·c++
盐真卿14 分钟前
python2
java·前端·javascript
梦梦代码精33 分钟前
BuildingAI vs Dify vs 扣子:三大开源智能体平台架构风格对比
开发语言·前端·数据库·后端·架构·开源·推荐算法
一嘴一个橘子1 小时前
mybatis - 动态语句、批量注册mapper、分页插件
java
组合缺一1 小时前
Json Dom 怎么玩转?
java·json·dom·snack4
又见野草1 小时前
C++类和对象(中)
开发语言·c++
危险、1 小时前
一套提升 Spring Boot 项目的高并发、高可用能力的 Cursor 专用提示词
java·spring boot·提示词
kgduu2 小时前
js之表单
开发语言·前端·javascript
kaico20182 小时前
JDK11新特性
java
钊兵2 小时前
java实现GeoJSON地理信息对经纬度点的匹配
java·开发语言