我有一个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 add
和contains
但这会检查 (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/