【问题标题】:How can for HashSet h and element e hold: h.contains(e) != new HashSet<>(h).contains(e)?HashSet h 和元素 e 如何保持:h.contains(e) != new HashSet<>(h).contains(e)?
【发布时间】:2015-03-26 00:48:43
【问题描述】:

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

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

为了让我更加困惑,new HashSet&lt;&gt;(h).contains(e) 返回正确答案 true。

这怎么可能?

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

【问题讨论】:

  • 相关,可能重复:stackoverflow.com/questions/4718009
  • 我不会认为这是重复的,因为我的问题更具体。如果您已经知道要查找的内容,我同意相关帖子也回答了我的问题。但在问之前,我尽力寻找答案,但失败了。因此,寻找“包含方法的奇怪行为”或类似内容的人可能会发现这很有用。

标签: java collections contains


【解决方案1】:

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

【讨论】:

  • 啊!我从来没想过,但这是有道理的,而且很可能这是我的问题。我会调查一下...我只是想知道我以前怎么没有在这个陷阱中跑过...
猜你喜欢
  • 2011-01-11
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多