java面试-0209-HashMap实现原理?put/get方法执行过程?

jdk1.8HashMap的底层数据结构是Node数组+链表+红黑树

向HashMap添加键值对时,步骤如下

  1. 通过哈希函数计算键key的哈希值
  2. 判断内部数组是否为空或者长度为0,是则调用resize初始化
  3. 根据哈希值确定数组下标,如果数组对应下标没有数据,则直接插入
  4. 如果对应下标有数据(哈希冲突)会先判断key是否相同,如果是则覆盖value,否则需要判断该数据是否为红黑树节点,是则向红黑树中插入或覆盖节点,否则向链表中插入或覆盖数据。在链表中插入节点后,如果链表长度大于等于8且数组长度>=64,则把链表转换为红黑树(查询效率O(logN),比链表O(n)快)。提升查询性能,当红黑树节点个数小于6时转为链表​
  5. 如果元素个数超过阈值threshold则调用resize扩容。扩容后重新计算所有已有节点的哈希值并重新分配到新的数组中(称为 rehash)

获取元素时用哈希函数计算键key的哈希值,通过(n - 1) & hash计算数组下标,判断内部数组对应下标数据的key与key是否相等,是则直接返回,否则,判断节点是否为树节点,是则查找红黑树直到找到key相等的,否则遍历链表查找key相等的值,没有则返回null

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程岁月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值