改变HashSet / HashMap内对象的hashCode

时间:2016-02-16 22:56:31

标签: java arraylist hashmap hashcode hashset

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

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

这种方法效果很好。我担心这种方法在与HashSetHashMap s一起使用时是否会给我带来麻烦。内部哈希表在添加对象时设置。在将对象添加到setContent()HashSet(及其hashCode更改)后调用HashMap会发生什么?

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

非常感谢您的见解。

1 个答案:

答案 0 :(得分:4)

  

如果在将对象添加到HashSet或HashMap(及其hashCode更改)后调用setContent()会发生什么?

灾害。

  

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

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

  

注意:如果将可变对象用作set元素,则必须非常小心。 如果在对象是集合中的元素时,以影响等于比较的方式更改对象的值,则不指定集合的​​行为。此禁止的特殊情况是它是不允许集合将自身包含为元素。

一般来说,这种错误会表现为元素在你的集合中“在”和“不在”,不同的方法不同意。你可能会很幸运,你的元素似乎仍然存在于收藏中,或者它们可能不存在;这可能基本上是随机发生的。

这是为什么大多数物体都是不可变的优秀实践的众多原因之一 - 在施工后首先完全无法修改。