Java集中对象的可变字段


问题内容

我在假设,如果你有一个包含一个Java集<>内(或在地图<>对于这个问题的关键)的对象,所使用的任何字段,以确定身份或关系(通过纠正hashCode()equals()compareTo()等。)无法更改而不会导致对集合的操作未指定的行为?(编辑:正如在其他问题中提到的)

(换句话说,这些字段应该是不可变的,或者您应该要求从集合中删除对象,然后进行更改,然后重新插入。)

我问的原因是我正在阅读《Hibernate
Annotations参考指南》
,并且有一个示例,其中有一个,HashSet<Toy>但是Toy该类具有字段name并且serial是可变的,并且也在hashCode()计算中使用…在我的脑海中闪过一个红旗。我只是想确保我了解它的含义。


问题答案:

的javadoc Set

注意:如果将可变对象用作集合元素,则必须格外小心。如果对象的值以影响相等比较的方式更改,而对象是集合中的元素,则不指定集合的​​行为。此禁止的一种特殊情况是,不允许集合将自身包含为元素。

这只是意味着您可以在集合中使用可变对象,甚至可以更改它们。您只应确保所做的更改不会影响Set查找项目的方式。为此HashSet,这将不需要更改用于计算的字段hashCode()