在你的例子中,一个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