java - HashSet 项等于,但 HashSet 不包含

标签 java hashset

我有一个HashSet<Obj>包含一件元素。尝试添加到集合中的新项目与现有项目相同,.equals() 。确认newElement事实上是一样的,我有一些调试打印循环通过我的 HashSet并打印每个项目:

does current item .equals(newElement) .

这证实了有一个 .equals()对象已经在集合中。

如果我调用add(newElement),这就是乐趣的开始。我希望它不会添加或至少覆盖集合中已有的内容。添加后,该集合应仅包含 1 个唯一项目。就我而言,它有 2 个!

帮助找出原因 add()就是这样工作的,我运行了 Set.contains(newElement)应该返回 true,但在我的例子中它返回 false。这就是为什么我的add()按照它的方式工作。

集合中的某个项目可能是 .equals(newElement) 的任何原因但是Set.contains(newElement)可以返回 false 吗?我检查了我的.equals()它似乎按照我期望的方式工作,打印出对象显示什么 .equals()正在确认。我想也许有什么办法 HashSet handle addcontains但这会检查 (o==null ? e==null : o.equals(e))来自 Java 文档。

我也覆盖hashCode() ,我在调试中打印的值显示了相同的逻辑项。

最佳答案

Any reason why an item in a set could be .equals(newElement) but Set.contains(newElement) could return false?

是的 - 您需要实现 hashCode() 以及 equals,并且它需要检查与 equals() 完全相同的字段。你说hashcode只是近似相等,这没有多大意义。如果 hashCode() 对于两个不同的对象返回不同的结果(默认情况下,如果您没有覆盖它),那么 HashSet 将假定它们是唯一的(即使 equals() 返回 true。)

如果hashCode()为两个对象返回相同的值,并且equals()返回true(在两个对象上对称),那么这将确保你不能这两个对象都在 HashSet 中。此规则没有(合理的)异常(exception),因此如果您认为 hashCode()equals() 的行为正确且一致,那么您的逻辑中一定存在缺陷某处。

关于java - HashSet 项等于,但 HashSet 不包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47908818/

相关文章:

java - 在Java中,我如何获取输入IP地址并将其转换为其特定位

java - 当我们检查任何 Set!=null 时输出

c# - 改进我选择具有唯一值的多个 XElement 以构建列表的方式

C# HashSet VS C++ std::unordered_set 自定义类键。 C++ 更慢……不可能。如何达到C#的速度?

java - 获取列表的独特元素

java - 如何判断是否按下了ESC?

java - JVM/CLR 上相同字节的不同浮点值

c# - HashSet.IsSuperSetOf 和 IsProperSuperSetOf 之间的区别?

java - Clojure 反射警告 - 调用写入无法解决

java - Graphviz Graph creation noobie 来自 java 的图像