【问题标题】:Altering hashCode of object inside of HashSet / HashMap更改 HashSet / HashMap 内对象的 hashCode
【发布时间】:2016-05-28 10:41:07
【问题描述】:

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

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

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

我应该在添加/放入HashSets 或HashMaps 之前完全设置(影响哈希码的)内容吗?一般是否建议在添加对象之前完成构建?

非常感谢您的见解。

【问题讨论】:

  • 如果您可以使用Map&lt;String, Bla&gt; map = new HashMap&lt;&gt;(),您可以在其中使用字符串标识符作为映射键,那么即使值随后发生变化,您也不应该有问题。

标签: java arraylist hashmap hashcode hashset


【解决方案1】:

如果在将对象添加到 HashSet 或 HashMap(并且其 hashCode 发生变化)之后调用 setContent() 会发生什么?

灾难。

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

是的。

相关文档在java.util.Set:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-02-14
    • 2012-10-22
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2013-10-25
    相关资源
    最近更新 更多