Java:修改更改哈希码的id

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

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

感谢帮助。

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

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

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

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

您提供的选项包括:

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

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