首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HashSet项等于,但HashSet不包含

HashSet项等于,但HashSet不包含
EN

Stack Overflow用户
提问于 2017-12-20 22:57:59
回答 2查看 230关注 0票数 0

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

does current item .equals(newElement)

这将确认在集合中已经存在.equals()对象。

这就是有趣的开始,如果我调用add(newElement),我希望它不会添加,或者至少覆盖集合中已经存在的内容。该集合在add之后应该只有%1个唯一项。在我的例子中,它有2个!

为了帮助弄清楚为什么add()是这样工作的,我运行了一个Set.contains(newElement),它应该返回true,但在我的例子中,它返回false。这就是为什么我的add()是这样工作的。

为什么集合中的一项可以是.equals(newElement),而Set.contains(newElement)可以返回false?我已经检查了我的.equals(),它似乎按照我预期的方式工作,打印出的对象显示了.equals()正在确认的内容。我想也许是关于HashSet如何处理addcontains的,但它检查了HashSet文档中的(o==null ? e==null : o.equals(e))

我还覆盖了hashCode(),这是我在debug中打印的值,它显示相同的逻辑项。

EN

回答 2

Stack Overflow用户

发布于 2017-12-20 23:01:06

为什么集合中的一项可以是.equals(newElement),而Set.contains(newElement)可以返回false?

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

如果hashCode()为两个对象返回相同的值,而equals()返回true (在两个对象上对称),那么这将确保您不能在HashSet中同时拥有这两个对象。这条规则没有(合理的)例外,所以如果您认为hashCode()equals()的行为都是正确和一致的,那么您的逻辑中一定存在某个缺陷。

票数 3
EN

Stack Overflow用户

发布于 2017-12-20 23:14:15

Equals和hashCode方法有一个特定的约定:

1.如果元素彼此相等,即equals返回true,则这些对象的hashCode值必须匹配。

2.如果对象的hashCode的值是相同的,那么这并不意味着它们的equals将返回true。对象不必彼此相等,即可能发生碰撞。

现在分别考虑每种情况:

1.Equals和hashCode不会被覆盖,这意味着只有当链接相等时,equals才会返回true,而equals可以是相等的,也可以不是。无论hashCode的值是多少,大小都将是2。

2.重新定义equals和hashCode,然后我们将有相同的散列值,我们将得到相同的单元格,equals将确定列表中的对象已经存在,因此大小将等于1。

3.equals不会被重新定义,hashCode会被覆盖。在这种情况下,单元格索引将是相同的,但在列表中找不到相同的元素,因此大小将等于2。

4. 4.equals被覆盖,hashCode未定义。这取决于hashCode的值是如何在Object类中生成的。如果值​​相同,则列表相同,相应地,表中元素的数量将为1。如果不同,将在不同的列表中进行搜索,并且找不到重复项,则大小将等于2。

类似地,执行remove,contains操作。

例如,关于HashSet/

代码语言:javascript
复制
class Dog{
String color;

public Dog(String s){
    color = s;
}   

}

代码语言:javascript
复制
 public class SetAndHashCode {
    public static void main(String[] args) {
    HashSet<Dog> dogSet = new HashSet<Dog>();
    dogSet.add(new Dog("white"));
    dogSet.add(new Dog("white"));

    System.out.println("We have " + dogSet.size() + " white dogs!");

    if(dogSet.contains(new Dog("white"))){
        System.out.println("We have a white dog!");
    }else{
        System.out.println("No white dog!");
    }   
}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47908818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档