一线大厂面试真题——HashMap是怎么解决哈希冲突的

本文详细解释了Hash算法、Hash表的工作原理,重点介绍了哈希冲突的概念以及四种常见的解决方法,包括开放定址法、链式寻址法、再hash法和公共溢出区。特别提到了HashMap在JDK1.8中的改进,以及这些知识在实际项目中的重要性,对于Java开发者面试具有参考价值。
摘要由CSDN通过智能技术生成

问题解答

这个问题从三个方面来回答:

要了解Hash冲突,那首先们要先了解Hash算法和Hash表。

a.    Hash算法,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出结果是散列值。

b.   Hash表又叫做“散列表”,它是通过key直接访问在内存存储位置的数据结构,在具体实现上,们通过hash函数把key映射到表中的某个位置,来获取这个位置的数据,从而加快查找速度。

c.   所谓hash冲突,是由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,所以总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。

d.   通常解决hash冲突的方法有4种:

i.   开放定址法,也称为线性探测法,就是从发生冲突的那个位置开始,按照一定的次序从hash表中找到一个空闲的位置,然后把发生冲突的元素存入到这个空闲位置中。ThreadLocal就用到了线性探测法来解决hash冲突的。

向这样一种情况(如图),在hash表索引1的位置存了一个key=name,当再次添加key=hobby时,hash计算得到的索引也是1,这个就是hash冲突。而开放定址法,就是按顺序向前找到一个空闲的位置来存储冲突的key。

ii.   链式寻址法,这是一种非常常见的方法,简单理解就是把存在hash冲突的key,以单向链表的方式来存储,比如HashMap就是采用链式寻址法来实现的。

向这样一种情况(如图),存在冲突的key直接以单向链表的方式进行存储。

iii.   再hash法,就是当通过某个hash函数计算的key存在冲突时,再用另外一个hash函数对这个key做hash,一直运算直到不再产生冲突。这种方式会增加计算时间,性能影响较大。

iv.   建立公共溢出区,就是把hash表分为基本表和溢出表两个部分,凡事存在冲突的元素,一律放入到溢出表中。

e.    HashMap在JDK1.8版本中,通过链式寻址法+红黑树的方式来解决hash冲突问题,其中红黑树是为了优化Hash表链表过长导致时间复杂度增加的问题。当链表长度大于8并且hash表的容量大于64的时候,再向链表中添加元素就会触发转化。

结尾

这道面试题主要考察Java基础,面向的范围是工作1到5年甚至5年以上。

因为集合类的对象在项目中使用频率较高,如果对集合理解不够深刻,容易在项目中制造隐藏的BUG。

所以,再强调一下 ,面试的时候 ,基础是很重要的考核项!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值