面试问到hashmap底层原理

本文解析了HashMap作为数据结构的基础概念,介绍了如何通过hash运算存储和获取键值对,以及链表法解决hash碰撞问题。重点讲解了数组固定长度导致的扩容策略,涉及负载因子这一关键参数。

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

1.hashmap只是一个数据结构,首先要把hash和map拆开来看,map是这种集合所存储的数据类型,是KV键值对,hashmap也是派生自map接口,hashmap利用数组下标可以随机访问的特性,实现了可以快速存取的树结构,且时间复杂度是接近O1的。

2.存入和获取:首先对存入的数据进行一个hash运算,得到它应该所处的数组的下标位置,根据key来调用他的hashcode方法来得到hash值。hashmap使用高位和低位进行异或运算,目的是让高位和低位都能参与运算,使得hash值分布的更均匀。获取数据也是如此,通过hash算法得到具体的数据所在的下标值来直接获取。但我们不能保证两个不一样的数据的hash值不一样,再加上数组下标是一样的,所以发生hash碰撞是不可避免的。

3.hashmap选择了链表法来解决hash碰撞。

4.数组一但被创建,那么他的长度将不能被改变,,hash表的性能就会从O1无限趋于On,这时不得不去扩容,扩容是在新的内存地址当中开辟一片空间,创建一个心的数组来进行数据的存储。

5.这时扩容因子或叫负载因子出现了,当我们hash表当中的数据的总个数大于等于数组的长度乘以扩容因子的长度时区扩容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

B_il_l

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

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

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

打赏作者

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

抵扣说明:

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

余额充值