Map集合的实现类:HashMap + 源码

HashMap

 

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用null值 和 null键

Map集合的实现类:HashMap + 源码

查看构造方法:默认初始的容量为16 ,ArrayList默认初始值是 10 。 默认加载因子为0.75,什么意思呢?就是说当数据元素达到容量的75%时,就会进行扩容

方法和map中的方法是一样的

 

遍历的方法

Map集合的实现类:HashMap + 源码

 

HashMap源码分析

 

默认初始容量大小 : 1 << 4    (16)Map集合的实现类:HashMap + 源码

最大容量大小 : 1  << 30 : 2的30次方Map集合的实现类:HashMap + 源码

默认的加载因子: 0.75 Map集合的实现类:HashMap + 源码

由于1.8之后增加了红黑树,所以hashMap也发生了一点变化增加了:Map集合的实现类:HashMap + 源码

Map集合的实现类:HashMap + 源码

hashmap的链表变成红黑树的两个条件: 数组的长度大于64,链表的长度大于 8 

当链表的长度变成6了,红黑树就会变成链表了Map集合的实现类:HashMap + 源码

 

Map集合的实现类:HashMap + 源码

 

刚创建好hashmap之后,没有添加元素的时候     table(数组)为  null , size = 0 ,数组长度不是16,因为还没赋值,这么做的目的是节省空间

在添加第一个数据的时候,数组大小就变成了16。

 

当数据添加到容量的0.75时,16*0.75 = 12,数据量达到12时,就会resize,变成原来的2倍,16*2 = 32 Map集合的实现类:HashMap + 源码,源码就是这个,左移了一位

Map集合的实现类:HashMap + 源码

 

 

HashMap的总结

1、HashMap刚创建的时候,table 为 null。为了节省空间,当添加第一个元素时,table的容量就会调整为16

2、当元素个数大于阈值(16*0.75 = 12)时,会进行扩容,扩容后的大小为原来的 2 倍。目的是减少调整元素的个数

3、jdk 1.8 当每个链表的长度大于 8,并且数组元素个数大于64 时,会调整为红黑树,目的是提高执行效率

4、jdk1.8 当链表长度小于 6时,调整为链表

5、jdk1.8 以前,链表是从头插入的,jdk 1.8之后变成了从尾插入

 

 

HashSet 的源码其实就是用的 hashMap, 其实都是差不多的结构