-1

嗨,我在一个名为 Memory 的类中有一个如下所示的 HashSet:

Set<Idea> ideas = new HashSet<Idea>();

泛型“Idea”是我编写的另一个类,它覆盖了 hashcode() 和 equals()。我希望能够在 HashSet 想法中获取(而不是删除)一个 Idea 对象,然后通过向它添加一些内容来更改它,可能会更改它的 hashcode() 返回值。我听说这是行不通的,但没有人解释原因。我想知道是否有人可以告诉我如何最有效地做到这一点。

4

3 回答 3

2

HashSet 内部使用 HasMap,其值与 key 相同。对于将对象放入 Hashset,jvm fill 首先计算对象的哈希码,然后根据该哈希码选择相应的桶并放入对象。所以如果你在更改哈希码之后将对象放入哈希集中,您将无法正确获取其位置。因此,如果您真的想删除元素,最好从哈希集中删除对象更改其值,然后再将其放回

于 2013-01-15T05:36:02.240 回答
1

它不会起作用,因为哈希码是找到对象的关键,如果您修改对象以更改它的哈希码,您将无法再次找到它。

这就像字典里的条目,如果你改变它,你就再也找不到了。这有意义吗?

于 2013-01-15T05:28:24.810 回答
1

如果要执行查找,则应该使用 Map。如果要更改键(或 Set 的元素),则必须先将其删除并再次添加。因此,您的密钥应该只有不可变字段。

于 2013-01-15T08:11:37.460 回答