1.hashmap是实现了map接口,继承了AbtractMap类

2.在创建对象的时候会调用map的实现类HashMap

3.存放数据是以键值对的形式存放。

4.存放数据是通过put方法

5.put方法底层是通过putVal方法来实现的,其中参数包括key value的值,以及通过key计算出来的hash值

 

HashMap底层学习笔记

HashMap底层学习笔记

6.HashMap底层实际上是以数组的方式来存储的。当数据传入的时候,数组为null的时候会触发resize方法

HashMap底层学习笔记

7.resize中关键性的代码,如果数组为空,就会初始化一个Node类型的数组,其中初试长度为16

HashMap底层学习笔记

HashMap底层学习笔记

HashMap底层学习笔记

8.其中n上面通过resize初始化, n = (tab = resize()).length;  resize方法初始化数组的长度为16,所以n=16

9.其中i = (n - 1) & hash,这种计算方法保证了i始终是在数组的范围内的数值。所以通过计算i的值,然后存放到tab[]数组中。

10.如果要存放的位置为空,就创建一个新的结点。相当于C语言中的链表一样,(存放数据区域)data 和 (指向下一个结点的地址)next 构成结点。

HashMap底层学习笔记

HashMap底层学习笔记

HashMap底层学习笔记

11.当计算的i值相同的时候就会以链表的方式来存储,上一个数据next中创建一个新的节点,并且next指向新的节点

HashMap底层学习笔记

 

12.当相同链表长度达到8的时候,会自动转化为红黑二叉树来优化map。

HashMap底层学习笔记

 

总结:map的底层结构实际上是一个数组,每个值上面存放链表,或者是值,又或者是红黑二叉树。

相关文章: