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

来源:互联网 发布:cad椭圆指定数据怎么画 编辑:程序博客网 时间:2024/05/21 05:07

面试的时候问到过这个问题,之前看书的时候也看到过,记得不算很牢固。
只隐约记得推荐使用不变类如 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)