java - Java Set 中对象的可变字段

标签 java collections identity mutable

如果您有一个包含在 Java Set<> 中的对象(或作为 Map<> 中的键),那么我是否正确地假设任何用于确定身份或关系的字段(通过hashCode()equals()compareTo() 等)不能在不导致对集合操作的未指定行为的情况下更改? (编辑:在 this other question 中提到)

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

我问的原因是我正在阅读 Hibernate Annotations reference guide它有一个例子,其中有一个 HashSet<Toy>但是Toy类有字段 nameserial是可变的,也用于 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/

相关文章:

java - 如何将字符串数据转换为json?

java - 通过套接字发送的消息未在接收端打印

java - 确定 List<Foo> 的最简洁方法包含 Foo.getBar() = "Baz"的元素?

java - ArrayDeque 中的方法 clear()

sql-server - 如何使用 SQL 批量复制获取插入数据记录的标识

java - 从 WSDL 创建 Java 类

java - Jersey - 请求的资源(未找到)不可用

c# - linq 问题 : querying nested collections

windows - 如何确定 Windows 计算机的身份?

python - "is"运算符对整数的行为异常