改变 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
这种方法效果很好。我担心这种方法在与 HashSet
s 或 HashMap
s 一起使用时是否会给我带来麻烦。添加对象时会设置内部散列 table。如果在将对象添加到 HashSet
或 HashMap
(及其 hashCode 更改)后调用 setContent()
会发生什么情况?
我应该在 添加/放入 HashSet
或 HashMap
之前完全设置(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"你的集合,不同的方法不一致。您可能很幸运,您的元素可能看起来仍在集合中,也可能不在;这可能基本上是随机发生的。
这是为什么将大多数对象设置为不可变的最佳实践的众多原因之一——在构建后一开始就完全不可能修改。
我对 Java 比较陌生,对以下事情感到困惑:我通常在设置内容之前将对象添加到 ArrayList
。即,
List<Bla> list = new ArrayList<>();
Bla bla = new Bla();
list.add(bla);
bla.setContent(); // content influences hashCode
这种方法效果很好。我担心这种方法在与 HashSet
s 或 HashMap
s 一起使用时是否会给我带来麻烦。添加对象时会设置内部散列 table。如果在将对象添加到 HashSet
或 HashMap
(及其 hashCode 更改)后调用 setContent()
会发生什么情况?
我应该在 添加/放入 HashSet
或 HashMap
之前完全设置(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"你的集合,不同的方法不一致。您可能很幸运,您的元素可能看起来仍在集合中,也可能不在;这可能基本上是随机发生的。
这是为什么将大多数对象设置为不可变的最佳实践的众多原因之一——在构建后一开始就完全不可能修改。