美文网首页Java语言基础
使用可变类作为HashMap键值所带来的问题

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

作者: SHAN某人 | 来源:发表于2017-09-08 17:15 被阅读21次

    面试的时候问到过这个问题,之前看书的时候也看到过,记得不算很牢固。
    只隐约记得推荐使用不变类如 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()取值的底层算法是怎样实现的?

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/tjxnjxtx.html