如果您有一个包含在 Java Set<> 中的对象(或作为 Map<> 中的键),那么我是否正确地假设任何用于确定身份或关系的字段(通过hashCode()
、 equals()
、 compareTo()
等)不能在不导致对集合操作的未指定行为的情况下更改? (编辑:在 this other question 中提到)
(换句话说,这些字段应该是不可变的,或者您应该要求从集合中删除对象,然后更改,然后重新插入。)
我问的原因是我正在阅读 Hibernate Annotations reference guide它有一个例子,其中有一个 HashSet<Toy>
但是Toy
类有字段 name
和 serial
是可变的,也用于 hashCode()
计算...我的脑海中出现了一个危险信号,我只是想确保我理解它的含义。
最佳答案
Set
的 javadoc 说
Note: Great care must be exercised if mutable objects are used as set elements. The behavior of a set is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is an element in the set. A special case of this prohibition is that it is not permissible for a set to contain itself as an element.
这只是意味着您可以在集合中使用可变对象,甚至可以更改它们。您只需确保更改不会影响 Set
查找项目的方式。对于 HashSet
,不需要更改用于计算 hashCode()
的字段。
关于java - Java Set 中对象的可变字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1076652/