HashSet h 和元素 e 如何保持:h.contains(e) != new HashSet<>(h).contains(e)?

How can for HashSet h and element e hold: h.contains(e) != new HashSet<>(h).contains(e)?

在 Java 8 中,我有一个 HashSet h(由泛型正确键入),其中 hashCode/equals 方法实现到类型层次结构的底部 - 显然是正确的,因为 eclipse 为我做了.

在某些(罕见的)情况下,方法调用 h.contains(e) returns false - 这是错误的(据我理解),因为集合中有一个元素 e'等于 hashCodes 和 equals 方法 e.equals(e') 返回 true.

为了让我更加困惑,new HashSet<>(h).contains(e) returns 正确答案正确。

怎么会这样?

由于这种罕见的情况是在一个难以追溯的大程序中的某个时刻产生的,我无法提供 MWE,但如果需要,我可以提供更多信息。

如果您向 HashSet 添加一个元素,更改用于计算 hashCode() 的该元素的某些 属性(从而更改该元素的 hashCode()),您所描述的情况就会发生element) 然后调用 contains(e),它根据 hashCode() 的新值搜索元素,但找不到它,因为它存储在与 [= 的旧值匹配的位置10=]。当您将元素放入新的 HashSet 时,它会存储在与新的 hashCode 匹配的位置,因此 contains 有效。