我对Java比较陌生,对以下事情感到困惑:我通常在设置内容之前将对象添加到ArrayList
。即,
List<Bla> list = new ArrayList<>();
Bla bla = new Bla();
list.add(bla);
bla.setContent(); // content influences hashCode
这种方法效果很好。我担心这种方法在与HashSet
或HashMap
s一起使用时是否会给我带来麻烦。内部哈希表在添加对象时设置。在将对象添加到setContent()
或HashSet
(及其hashCode更改)后调用HashMap
会发生什么?
我应该在添加/放入HashSet
或HashMap
之前完全设置(hashCode影响)内容吗?通常建议在添加之前完成构建对象吗?
非常感谢您的见解。
答案 0 :(得分:4)
如果在将对象添加到HashSet或HashMap(及其hashCode更改)后调用setContent()会发生什么?
灾害。
在添加/放入HashSets或HashMaps之前,我是否应该完全设置(hashCode影响)内容?通常建议在添加之前完成构建对象吗?
是
相关的文档行在java.util.Set
:
注意:如果将可变对象用作set元素,则必须非常小心。 如果在对象是集合中的元素时,以影响等于比较的方式更改对象的值,则不指定集合的行为。此禁止的特殊情况是它是不允许集合将自身包含为元素。
一般来说,这种错误会表现为元素在你的集合中“在”和“不在”,不同的方法不同意。你可能会很幸运,你的元素似乎仍然存在于收藏中,或者它们可能不存在;这可能基本上是随机发生的。
这是为什么大多数物体都是不可变的优秀实践的众多原因之一 - 在施工后首先完全无法修改。