gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:02:09 28 4
gpt4 key购买 nike

我有一个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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com