在Java中返回Hashset中的对象

时间:2013-01-15 05:24:26

标签: java hashcode hashset

嗨,我在名为Memory的类中有如下的HashSet:

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

就像字典中的条目,如果你改变它,你将不会再找到它。这有道理吗?

答案 2 :(得分:1)

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