学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 小时前
Java 11+ HttpClient 实战:从 HttpURLConnection 到现代 HTTP 客户端的全面升级
java·开发语言·http
今晚打老虎1 小时前
c++(斗罗大陆3)
开发语言·c++·斗罗大陆3
mywpython2 小时前
Python使用消息队列rabbitmq
开发语言·python·rabbitmq
Felix_XXXXL2 小时前
集成RabbitMQ+MQ常用操作
java·后端
hygge9992 小时前
JVM GC 垃圾回收体系完整讲解
java·开发语言·jvm·经验分享·面试
wuwu_q2 小时前
通俗易懂 + Android 开发实战的方式,详细讲讲 Kotlin 中的 StateFlow
android·开发语言·kotlin
峰哥的Android进阶之路2 小时前
Kotlin面试题总结
android·开发语言·kotlin
froginwe112 小时前
RSS 语法:全面解析与优化指南
开发语言