gpt4 book ai didi

java - 用 Set 实现 equals

转载 作者:行者123 更新时间:2023-12-03 23:13:29 26 4
gpt4 key购买 nike

我有这门课:

private static class ClassA{
int id;
String name;

public ClassA(int id, String name){
this.id= id;
this.name = name;
}

@Override
public boolean equals(Object o) {
return ((ClassA)o).name.equals(this.name);
}

如果我覆盖 ClassA 中的 equals 方法以仅比较名称,为什么这个 main 打印 2 个元素?

public static void main(String[] args){
ClassA myObject = new ClassA(1, "testing 1 2 3");
ClassA myObject2 = new ClassA(2, "testing 1 2 3");

Set<ClassA> set = new HashSet<ClassA>();
set.add(myObject);
set.add(myObject2);
System.out.println(set.size()); //will print 2, but I want to be 1!
}

如果我查看 Set Java documentation :

不包含重复元素的集合。更正式地说,集合不包含满足 e1.equals(e2) 的一对元素 e1 和 e2,并且最多包含一个空元素。顾名思义,该接口(interface)对数学集合抽象进行建模。

显然我只需要覆盖 equals,但是我听说我还必须覆盖 hashcode,但为什么呢?

最佳答案

它们具有不同的哈希值,因为您没有覆盖哈希代码。这意味着它们被放入 HashSet 中的两个不同桶中,因此它们从一开始就不会与 equals 进行比较。

我要补充

public int hashCode() {
return name.hashCode();
}

注意 id 没有用在 hashCode 中,因为它也没有用在 equals 中。

(附:我还想指出具有不在 equals 中使用的 id 的讽刺意味。这很有趣。通常情况恰恰相反:id 是 equals 中唯一的东西!)

关于java - 用 Set 实现 equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7573055/

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