在Java中错误地重写hashset的equals方法

在Java中错误地重写hashset的equals方法,java,overriding,equals,hashcode,hashset,Java,Overriding,Equals,Hashcode,Hashset,我有以下代码: public class Trooper { private String name; private boolean mustached; public Trooper(String name, boolean hasMustache) { this.name = name; this.mustached = hasMustache; } public String getName() { return name; } public boolean hasMustach

我有以下代码:

public class Trooper {
private String name;
private boolean mustached;
public Trooper(String name, boolean hasMustache) {
    this.name = name; this.mustached = hasMustache;
}
public String getName() { return name; }
public boolean hasMustache() { return mustached; }
public boolean equals(Trooper other) {
    if (this == other) return true;
    if (null == other || !(other instanceof Trooper)) return false;
    Trooper that = (Trooper) other;
    return this.name.equals(that.name) && this.mustached == that.mustached;
}
public int hashCode() { return 1; }
}
然后运行以下程序:

ArrayList<Trooper> troopers = new ArrayList<>();
troopers.add(new Trooper("Farva", true));
troopers.add(new Trooper("Farva", true));
troopers.add(new Trooper("Rabbit", false));
troopers.add(new Trooper("Mac", true));
Set<Trooper> trooperSet = new HashSet<>(troopers);
我了解调用contains方法时如何在hashSet中使用hashCode和equals。我猜它返回false而不是true的唯一原因是equals方法没有被正确重写。如果这就是上一条语句返回false的原因,为什么会是这样?

您正在重载
equals()
方法,而不是重写它。
equals()
的正确签名为:

public boolean equals(Object other) {
    ...
}
当前的
equals()
从未被
HashSet
使用。相反,将使用
Object#equals()
,从而得到结果

顺便说一下,包括
@Override
标记可以帮助发现这些错误。

您正在重载
equals()
方法,而不是重写它。
equals()
的正确签名为:

public boolean equals(Object other) {
    ...
}
当前的
equals()
从未被
HashSet
使用。相反,将使用
Object#equals()
,从而得到结果


顺便说一下,包含一个
@Override
标记可以帮助发现这些错误。

您是在重载equals()方法,而不是重写它

Object.equals()定义为:
public boolean equals(Object obj)
通过将参数指定为type
Trooper
您已经定义了一个新的方法签名


使用
@Override
注释确实有助于捕捉这样的错误;注释将警告您实际上没有覆盖任何内容。(像IntelliJ这样的好IDE中的静态检查也会捕捉到这一点,但这不是每个人的职责。)

您正在重载equals()方法,而不是重写它

Object.equals()定义为:
public boolean equals(Object obj)
通过将参数指定为type
Trooper
您已经定义了一个新的方法签名

使用
@Override
注释确实有助于捕捉这样的错误;注释将警告您实际上没有覆盖任何内容。(像IntelliJ这样的好IDE中的静态检查也会发现这一点,但这不是每个人都能做到的。)