使用 equals() 方法比较一个对象和一个字符串

Comparing an object with a String using equals() method

在下面的例子中,我期望 equals() 到 return true:

public class flower {
    String flower;
    public flower (String flower) {
        this.flower = flower;
    }

    public static void main(String[] args) {
        flower one = new flower("Flower");
        boolean isSame = false;
        if(one.equals("Flower")) {
            isSame = true;
        }
        System.out.print(isSame);
    }
} 

然而,我得到的结果是 false... 是因为我正在将一个对象与 String 进行比较吗?我看了equals()方法,据说比较Strings和Objects。为什么我得到的结果是 false,尽管它们是一样的?

简短的回答:您需要在 Flower 中重写 equals() 的实现(注意:大写 F)class。这会做一些你喜欢做的事情:

@Override
public boolean equals(Object o) {
    return (o instanceof Flower && ((Flower)o).flower.equals(flower)) ||
                (o instanceof String && o.equals(flower));
}

@Override
public int hashCode() {
    return flower.hashCode();
}

hashCode()equals() 一起覆盖是一种很好的形式:通常,您选择用于执行 equals() 的 'attributes'(例如字段)应该用于您的 hashCode()计算过。通俗地说,他们应该'agree'彼此。

big/major/severe 问题,正如我想这里几乎每个人都指出的那样,equals() 意味着 symmetric

It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.

不幸的是,对于您的 Flower class,String.equals(Object) 被定义为 as such:

The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object. (emphasis mine)

这意味着当您将 Flower 对象传递给 equals() 时,没有 String 会 return true

当然,您仍然可以违反惯例,但您很可能会 运行 遇到错误 - 小错误或大错误 - 当您了解更多有关该语言的信息时,例如Collection classes。

因此:避免与 equals().

进行此类比较

正如 Killian 所说,您正在将包含字符串属性的 Flower 对象与字符串进行比较。

如果您想查看 Flower 对象的名称属性是否等于您需要检查实际字符串的字符串。

one.name.equals("Flower")

认为这将是一个非常糟糕的主意,因为 Flower 对象不是字符串对象,它仅包含一个字符串对象,因此您不能进行同类比较。