Map集合的实现类:HashMap + 源码
HashMap
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用null值 和 null键
查看构造方法:默认初始的容量为16 ,ArrayList默认初始值是 10 。 默认加载因子为0.75,什么意思呢?就是说当数据元素达到容量的75%时,就会进行扩容
方法和map中的方法是一样的
遍历的方法
HashMap源码分析
默认初始容量大小 : 1 << 4 (16)
最大容量大小 : 1 << 30 : 2的30次方
默认的加载因子: 0.75
由于1.8之后增加了红黑树,所以hashMap也发生了一点变化增加了:
hashmap的链表变成红黑树的两个条件: 数组的长度大于64,链表的长度大于 8
当链表的长度变成6了,红黑树就会变成链表了
刚创建好hashmap之后,没有添加元素的时候 table(数组)为 null , size = 0 ,数组长度不是16,因为还没赋值,这么做的目的是节省空间
在添加第一个数据的时候,数组大小就变成了16。
当数据添加到容量的0.75时,16*0.75 = 12,数据量达到12时,就会resize,变成原来的2倍,16*2 = 32 ,源码就是这个,左移了一位
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, 其实都是差不多的结构