hashMap扩容机制理解

HashMap是Java中常用的存储结构,由数组和链表(或红黑树)组成。其初始容量为16,当负载因子(默认0.75)乘以容量达到75%时会发生扩容,扩容后容量翻倍。在JDK1.8中,如果链表长度达到8且数组长度为64,链表会转换为红黑树,以优化查找效率。当红黑树节点数小于6时,会转回链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

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的时候才会再次扩容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值