嗨,我在一个名为 Memory 的类中有一个如下所示的 HashSet:
Set<Idea> ideas = new HashSet<Idea>();
泛型“Idea”是我编写的另一个类,它覆盖了 hashcode() 和 equals()。我希望能够在 HashSet 想法中获取(而不是删除)一个 Idea 对象,然后通过向它添加一些内容来更改它,可能会更改它的 hashcode() 返回值。我听说这是行不通的,但没有人解释原因。我想知道是否有人可以告诉我如何最有效地做到这一点。
HashSet 内部使用 HasMap,其值与 key 相同。对于将对象放入 Hashset,jvm fill 首先计算对象的哈希码,然后根据该哈希码选择相应的桶并放入对象。所以如果你在更改哈希码之后将对象放入哈希集中,您将无法正确获取其位置。因此,如果您真的想删除元素,最好从哈希集中删除对象更改其值,然后再将其放回
它不会起作用,因为哈希码是找到对象的关键,如果您修改对象以更改它的哈希码,您将无法再次找到它。
这就像字典里的条目,如果你改变它,你就再也找不到了。这有意义吗?
如果要执行查找,则应该使用 Map。如果要更改键(或 Set 的元素),则必须先将其删除并再次添加。因此,您的密钥应该只有不可变字段。