使用可变类作为HashMap键值所带来的问题

面试的时候问到过这个问题,之前看书的时候也看到过,记得不算很牢固。
只隐约记得推荐使用不变类如 String,Integer 。

使用可变类作为HashMap键会带来什么问题?

如果使用可变类作为HashMap的键值,而不重写HashCode 和equals 方法,使用会产生同一键(对等的两个对象)存在两个地方的问题,产生可以存在重复键值 的假象。

为什么会产生这种现象,这就得看HashMap 怎么进行的put操作

HashMap 进行put操作 先拿到 key 的HashCode ,再对这个值执行hash函数拿到hash值,然后调用indexFor(hash, table.length); 方法找到hash 数组的槽位,如果key值为空,则赋值在0号槽位,然后遍历该槽位所在的链表,用key.equals判断如果存在相同的key就替换,否则用头插法加到槽位所在链表处。

具体过程各位看官请阅读HashMap源码,我这里看的是1.7 的版本。


通过分析HashMap put的过程我们知道,HashCode 主要用来定位 到哈希表的数组槽位,equals方法用来判断链表中是否有相同的key。如果没有重写HashCode方法,则调用的是Object的HashCode(返回对象的内部地址转换的一个整数值),两个理应对等的对象存在了不同的槽位所在链表,如果没有重写equals方法(Object的equals方法判断的是引用地址),两个理应对等的对象存在了同一个槽位所在链表的不同节点,而不是覆盖。

参考链接:
[[Java基础要义] Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?](http://blog.csdn.net/luanlouis/article/details/41547649)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值