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

四、最后的思考

相关推荐
程序员-周李斌1 分钟前
CopyOnWriteArrayList 源码分析
java·开发语言·哈希算法·散列表
廋到被风吹走2 分钟前
【Spring】两大核心基石 IoC和 AOP
java·spring
晚风(●•σ )6 分钟前
C++语言程序设计——【算法竞赛常用知识点】
开发语言·c++·算法
明有所思9 分钟前
springsecurity更换加密方式
java·spring
Byron Loong9 分钟前
【C#】离线场景检测系统时间回拨
开发语言·c#
却话巴山夜雨时i14 分钟前
295. 数据流的中位数【困难】
java·服务器·前端
free-elcmacom17 分钟前
机器学习入门<4>RBFN算法详解
开发语言·人工智能·python·算法·机器学习
韭菜钟18 分钟前
在Qt中实现mqtt客户端
开发语言·qt
java干货21 分钟前
优雅停机!Spring Boot 应用如何使用 Hook 线程完成“身后事”?
java·spring boot·后端