文章目录
引言
HashMap介绍
1、 HashMap的底层有数组 + 链表(红黑树)组成
2、存储形式key value,无序不可重复,key值保障不会重复
3、初始化容量16,官网推荐为2的倍数,为了散列均匀,提交存取效率,默认加载因子0.75,到75%的时候会扩容,扩容:扩容之后是原容里2倍。0.75是对时间和空间上的一个平衡选择。
4、key 存储的时候会调用底层hashcode(),hashcode是一串数字,然后会进行取余操作。
5、时间复杂度 每一次取数据O(1) , 大多数每一次插入数据O(1) ,理论上增删改查都是O(1)
hashMap扩容机制
HashMap的扩展原理可以理解为:HashMap用一个新的数组替换原来的数组。重新计算原数组的所有数据并插入一个新数组,然后指向新数组。如果阵列在容量扩展前已达到最大值,阈值将直接设置为最大整数返回。
我们创建一个HashMap的集合对象,底层node数组默认大小是16,当集合的存储容量达到一个临界值的时候会扩容,loadFactor * capacity (负载因子 * 容量),负载因子默认是0.75。
- 在jdk1.8中 ,一条链表的元素个数已经到8个,并且table数组长度达到64了,链表就会树化成红黑树
- 如果仅仅是链表元素个数到8 , 数组长度还没到64 , 那么就不会树化,而是数组长度会扩容为2倍 , 然后重新哈希,当然链表的长度可能超过8
- 但是如果红黑树的元素个数小于6 那么就会还原成链表, 当红黑树的元素个数不小于32的时候才会再次扩容