对HashMap的疑问

qq_38687599 2017-07-21 05:36:55
HashMap存放对象时如果Key相同那么Value会进行覆盖,那么底层为什么要数组+链表?直接数组+散列算法不就好了?反正Key一样链表中的对象也只会是最后进来的!!
...全文
469 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
CClusXX 2017-07-30
  • 打赏
  • 举报
回复
引用 2 楼 qq_38687599 的回复:
不同的key 有相同的hashCode 我懂,加了链表是会把hashCode一样的放在链表中,但是取的时候只取最后放进去的,那何必要链表呢?
这个逻辑你自己去证实过了吗?
ImAmelie 2017-07-30
  • 打赏
  • 举报
回复

//节点里存了几个东西
key
value
hash //对key进行哈希运算得出的值
next //指向下一个节点


给你打个比方吧
我这里有4个 不同的 key

key1
key2
key3
key4

//这里key1,和key2 的hash值相同

你要知道HashMap里封装的是一个数组 只不过元素是链表(这里的数组元素都是链表的表头)
key1 和key2 因为有相同的 hash值 所以对应同一个数组元素,
put(key1,值)如果对应数组元素为null的话,恭喜了,key1去进数组里当表头去了
put(key1,值)如果对应数组元素不为空,那就顺这这条链往下找,直到找到 next为null的地方,给你加到尾部
如果哈希表里有key1,因为能顺到key1的位置,程序看到了key1 就直接把值付给这个节点里的value了


lucifarcyl 2017-07-26
  • 打赏
  • 举报
回复
hashcode相同key不同的值取出来的是不同的对象,链表里的东西可不是只能取出来最后一个
花间_拾零 2017-07-26
  • 打赏
  • 举报
回复
object v = map.get(key); 过程使首先根据key的hash算法,算出数组下标位置,然后遍历链表找到value。 不同的key可能映射到数组相同下标,但是随后会比较key是否相等来返回value,此时会调用equals方法。也就是说equals不相等的key,会分别存入链表的不同位置。这样下标相同,但是本质上不相等的key,就都可以保存到链表的不同位置了。反之,如果equals相等的话,说明是同一个key,直接覆盖旧值。
  • 打赏
  • 举报
回复
hascode相同的元素不一定是一样的 还要对比equals 判断是否完全一致相同 要记住hascode相同equals不一定相同 equals相同的,hascode一定相同
wautsns 2017-07-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_38687599 的回复:
不同的key 有相同的hashCode 我懂,加了链表是会把hashCode一样的放在链表中,但是取的时候只取最后放进去的,那何必要链表呢?
取出最后一个?你的理解有误,put时,若key的hashCode相同,它不是直接将entry加在链表后面,而是在链表中对key逐一进行equals()判断key是否相同,若相同则覆盖,若没有则添加到链表中。
qq_38687599 2017-07-21
  • 打赏
  • 举报
回复
不同的key 有相同的hashCode 我懂,加了链表是会把hashCode一样的放在链表中,但是取的时候只取最后放进去的,那何必要链表呢?
闰六月 2017-07-21
  • 打赏
  • 举报
回复
因为不同的key可能会有相同的hashcode,宝贝

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧