学Java第四十四天——Map实现类的源码解析
一、基础知识
在某个类的界面按快捷键:CTRL+F12

圈m代表方法,后面是:方法名、参数、返回值类型,
再后面的向上箭头⬆代表:该方法是重写⬆后的那个类or接口 的。
灰色的方法是直接继承后面➡那个类的,没有重写。因为重写了,所以继承父类的方法就无效了,变成灰色了。

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

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

![]()
二、HashMap源码解析

put方法的源码解析:




1、添加第一个元素&添加的元素位置没有其他元素:
- 无参构造方法:不会创建一个数组,只会得到一个加载因子,此时数组是null
- 当put()第一个元素时,才会创建数组,数组的地址此时才不是null
- put()里面调用了putval()
- 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、添加第二、三、四……个元素
- 先找到要插入哪个节点的后面,其实就是通过循环遍历null找到parent——>>put()
- 找到要添加的元素是左孩子节点还是右孩子节点,真正的添加节点——>>>addEntry()
- 满足红黑树规则——>>>fixAfterInsertion()
2.1put()


2.2addEntry()

2.3fixAfterInsertion()

四、最后的思考


