改变 HashSet / HashMap 中对象的 hashCode

Altering hashCode of object inside of HashSet / HashMap

我对 Java 比较陌生,对以下事情感到困惑:我通常在设置内容之前将对象添加到 ArrayList。即,

List<Bla> list = new ArrayList<>();
Bla bla = new Bla();
list.add(bla);
bla.setContent(); // content influences hashCode

这种方法效果很好。我担心这种方法在与 HashSets 或 HashMaps 一起使用时是否会给我带来麻烦。添加对象时会设置内部散列 table。如果在将对象添加到 HashSetHashMap(及其 hashCode 更改)后调用 setContent() 会发生什么情况?

我应该在 添加/放入 HashSetHashMap 之前完全设置(hashCode 影响)内容 吗?通常是否建议在添加对象之前完成构建对象?

非常感谢您的见解。

What will happen if setContent() gets called after the object was added to HashSet or HashMap (and its hashCode changes)?

灾难。

Should I fully set the (hashCode influencing) content before adding / putting into HashSets or HashMaps? Is it generally recommended to finish building objects before adding them?

是的。

相关文档行在 java.util.Set:

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.

一般来说,这种错误会表现为元素同时是"in"和"not in"你的集合,不同的方法不一致。您可能很幸运,您的元素可能看起来仍在集合中,也可能不在;这可能基本上是随机发生的。

这是为什么将大多数对象设置为不可变的最佳实践的众多原因之一——在构建后一开始就完全不可能修改。