谈谈对jdk8以及以后版本的HashMap的理解

数据结构

HashMap 是由 数组(桶) + 链表 + 红黑树构成的;

put 流程

首先看桶节点的空间有没有开辟,没有则使用扩容开辟出桶空间,默认长度是16,接下来会判断key 是否产生hash冲突,如果没有产生hash冲突,则把此节点作为桶加入到数组中;产生hash冲突,使用链地址法来解决hash冲突的,首先判断数组节点即桶节点是树节点还是链表节点,树节点采用树节点的put方法,链表节点采用链表节点的添加方法,如果是链表的添加方式,则在添加时会判断链表长度,如果大于8,则将链表转化为红黑树

扩容机制 (resize()方法)

临界值(threshold )= 默认容量(DEFAULT_INITIAL_CAPACITY) * 默认扩容因子(DEFAULT_LOAD_FACTOR)
当hashmap中节点的数量达到临界值时,则会扩容至原来容量的2倍;
resize()方法 返回值为 tab 即为数组,是对数组进行2倍扩容。
对于旧数组中的链表节点,HashMap会将链表拆分为两个子链表,分别迁移到新数组的不同位置;
对于旧数组中的树节点,会将红黑树拆分为两个链表,若拆分后的链表长度≤6,退化为普通链表;否则,重新树化为红黑树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值