6

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

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

感谢帮助。

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

4

1 回答 1

10

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

Object的文档说:“维护 hashCode() 方法的通用合同,其中规定相等的对象必须具有相等的哈希码”

如您所见,如果您更改保存在 HashSet 中的对象的状态,则该对象将无法再通过 remove 方法访问或通过 HashMap 的 contains 方法找到。

您提供的选项是:

  1. 删除对象,更改它并再次添加它 - 如果 HashSet 是强制性的,那么效果很好,最简单的方法

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

于 2012-07-17T20:55:20.067 回答