HashMap的同一链表中对象的hashcode真的一样吗?

A:产生哈希碰撞的对象,以链表的形式存储在数组的同一个位置上

Q:HashMap的数组中同一链表上对象的hashcode都一样的吗?

A:不是,而且大多数情况下都不一样

那么问题来了,为什么HashMap中同一链表上对象的hashcode是不一样的呢?说到这里,我们首先熟悉下HashMap是如何产生一个数组下标的,先看下图HashMap存储对象的方法:

在509行中的红框中的代码我们可以看到下标 **i = (n - 1) & hash,**n 就是HashMap中数组的长度默认为16,hash就是通过对象key产生的hashcode。也就是下标是通过数组长度-1 和 hashcode 按位与产生的,现在我们假设有一个hash为1的,长度为16的数组,那么就是它产生的下标 i =15 & 1 ,换算成二进制如下图:

我们知道按位与是只有对应的2个二进制位都为1时,结果位才为1,所以最后下标 i=1。那么如果又有一个hash为17的对象放进来时,会发生什么呢?我们还是先看下标i =15 & 17,换算成二进制如下图:

没错,下标i还是等于1,这个时候由于1这个位置上已经有一个对象了,所以HashMap就会产生hash为1和hash为17都放在数组同一个位置链表上。

那么为什么会发生这种情况?可能有的人已经懂了:**由于数组长度默认为16,n-1为15,它的后4位为1,所以只要产生的hash值后4位一样,其他位任意组合都会产生相同的下标。**那么为什么大多数情况下HashMap中同一个链表上的hashcode都不一样?这是因为Hashmap中的哈希函数也叫作散列函数,它的目的就是为了让HashMap中的对象散列分布,所以2个不同的对象产生相同的hashcode的概率是很低的.

这里,我也自定义了一个HashMap来测试这个问题:

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值