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

时间:2015-01-27 11:54:51

标签: java collections contains

在Java 8中,我有一个HashSet h(通过泛型正确键入),hashCode / equals方法实现到类型层次结构的底部 - 显然正确就像eclipse为我做的那样。

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

为了让我的困惑更大,new HashSet<>(h).contains(e)会返回正确的答案。

这怎么可能?

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

1 个答案:

答案 0 :(得分:5)

如果向HashSet添加元素,更改在hashCode()的计算中使用的元素的某些属性(从而更改该元素的hashCode())然后调用{ {1}},它根据contains(e)的新值搜索元素,但无法找到它,因为它存储在与hashCode()的旧值匹配的位置。当您将元素放入新的HashSet时,它将存储在与新hashCode匹配的位置,因此hashCode()可以正常工作。