得物Android面试题及参考答案

简单介绍一下 HashMap 的原理(包括存储结构、哈希函数、碰撞处理等)

HashMap 是 Java 中常用的哈希表实现,基于哈希原理存储键值对。其核心原理涉及存储结构、哈希函数和碰撞处理三个关键部分。

存储结构:HashMap 采用数组 + 链表 + 红黑树的复合结构。数组是 HashMap 的主体,每个元素称为桶(Bucket)。当发生哈希冲突时,相同哈希值的元素会以链表形式存储在桶中。当链表长度超过阈值(默认 8)且数组长度达到 64 时,链表会转换为红黑树,以提高查询效率。

哈希函数:HashMap 通过哈希函数将键的 hashCode 映射到数组索引。为了减少哈希冲突,HashMap 对键的 hashCode 进行二次哈希处理,通过(h = key.hashCode()) ^ (h >>> 16)将高位信息与低位信息混合,降低哈希碰撞概率。然后通过(n - 1) & hash计算数组索引,其中 n 为数组长度。

碰撞处理:当两个不同的键计算出相同的哈希值时,发生哈希碰撞。HashMap 采用链地址法处理碰撞,将冲突的元素放入同一桶的链表中。为避免链表过长导致性能下降,当链表长度达到 8 且数组长度≥64 时,链表转换为红黑树(时间复杂度从 O (n) 降为 O (log n))。当红黑树节点数减少到 6 时,树结构会转回链表。

HashMap 调用 put 方法的执行流程是怎样的?

HashMap 的 put 方法用于存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大模型大数据攻城狮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值