Java集中对象的可变字段
问题内容:
我在假设,如果你有一个包含一个Java集<>内(或在地图<>对于这个问题的关键)的对象,所使用的任何字段,以确定身份或关系(通过纠正hashCode()
,equals()
,compareTo()
等。)无法更改而不会导致对集合的操作未指定的行为?(编辑:正如在其他问题中提到的)
(换句话说,这些字段应该是不可变的,或者您应该要求从集合中删除对象,然后进行更改,然后重新插入。)
我问的原因是我正在阅读《Hibernate
Annotations参考指南》
,并且有一个示例,其中有一个,HashSet<Toy>
但是Toy
该类具有字段name
并且serial
是可变的,并且也在hashCode()
计算中使用…在我的脑海中闪过一个红旗。我只是想确保我了解它的含义。
问题答案:
的javadoc Set
说
注意:如果将可变对象用作集合元素,则必须格外小心。如果对象的值以影响相等比较的方式更改,而对象是集合中的元素,则不指定集合的行为。此禁止的一种特殊情况是,不允许集合将自身包含为元素。
这只是意味着您可以在集合中使用可变对象,甚至可以更改它们。您只应确保所做的更改不会影响Set
查找项目的方式。为此HashSet
,这将不需要更改用于计算的字段hashCode()
。