Java:修改更改哈希码的id

avr*_*mar 5 java hashmap hashcode hashset

我使用HashSet,我需要修改一个对象的ID,但它改变了hashcode并破坏了HashSet和hashCode()方法的规则.

什么是最佳解决方案:从Set中删除对象并使用新ID添加对象,或者在Set中的每个对象中保留哈希代码(例如,在构造函数中生成),还是有其他方法可以解决此问题?

感谢帮助.

更新:我犯了错误:在对象中保留哈希代码很糟糕,因为在这种情况下,相等的对象可以有不同的哈希代码.

Any*_*toe 8

作为容器的HashSet通过您放入其中的项目的哈希码访问其项目(包含,删除).哈希码通常由其实例成员的状态构建.因此哈希码随着对象状态的操纵而改变.

Object的文档说:"维护hashCode()方法的一般契约,该方法声明相等的对象必须具有相同的哈希码"

正如您所注意到的,如果更改保留在HashSet中的对象的状态,则无法再通过remove方法访问该对象,也无法通过HashMap的contains方法找到该对象.

您提供的选项是:

  1. 删除对象,更改它并再次添加它 - 如果HashSet是必需的,那么工作很精彩,最简单

  2. 保持哈希码的值'某处' - 意味着,对于不相等的对象,您具有相同的哈希码.或者,如果您遵守文档,您可能会遇到两个等于且具有相同哈希码的对象,但它们的成员变量不同!这可能导致不可预测的错误.