hash hashcode变化_java – 当对象Hashcode更改时,在Hashmap或Hashset中查找会发生什么

在你的例子中,一个String是不可变的,所以它的hashcode不能改变.但是假设,如果一个对象的哈希码确实改变了,而哈希表中的一个键,那么就可能会消失,就哈希表查找而言.我在这个答案中详细介绍了一个相关的问题:

https://stackoverflow.com/a/13114376/139985. (原来的问题是关于一个HashSet,但一个HashSet真的是一个HashMap的封面,所以答案也涵盖了这个例子.)

可以肯定的是,如果HashMap或TreeMap的密钥以影响其各自的hashcode()/ equals(Object)或compare(…)或compareTo(…)合同的方式进行突变,则数据结构将“打破”.

Does this mean that once data is in a Hashset it shouldnt be changed.

是.

Or does it need to be rehashed? or is it done automatically etc?

它不会被自动重新打开. HashMap不会注意到键的哈希码已经改变了.实际上,当HashMap调整大小时,你甚至不会重新计算hashcode.数据结构记住原始的哈希码值,以避免在散列表调整大小时重新计算所有的哈希码.

如果您知道密钥的哈希码将要更改,则在更改密钥之前,您需要从表中删除该条目,然后将其重新添加. (如果您尝试在突变密钥后删除/放置,则删除将无法找到该条目.)

What is going on?

发生的是您违反了HashMap javadocs中明确规定的合同.不要这样做

@H_403_12@

@H_403_12@

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值