使用equals()方法将对象与String进行比较

Fuz*_*z X -2 java comparison language-features

在下面的例子中,我期待equals()返回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);
    }
} 
Run Code Online (Sandbox Code Playgroud)

但是,我得到的结果是false...是因为我正在将一个对象与一个对象进行比较String?我读了这个equals()方法,据说用Strings 比较Objects.为什么我得到结果false虽然它们是相同的?

h.j*_*.k. 7

答案很简单:你需要重写的执行equals()你的Flower(注:资本F)类.这将做你喜欢做的事情:

@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();
}
Run Code Online (Sandbox Code Playgroud)

重写hashCode()加上equals()好形式:通常,在"属性"(例如字段)你选择做一个equals()应该在你使用hashCode()的计算了.通俗地说,他们应该"同意"彼此.

大/大/严重的问题,正如几乎所有人在这里我推测指出,被认为equals()意味着是对称的:

它是对称的:对于任何非空引用值xy,x.equals(y)应真,当且仅当返回y.equals(x)返回true.

不幸的是,对于你的Flower班级,String.equals(Object)定义如下:

结果是true 当且仅当参数不是null并且是一个String表示与该对象相同的字符序列的对象时.(强调我的)

这意味着当您将对象传递给时,String将不会返回.trueFlowerequals()

当然,你仍然可以违背惯例,但是当你更多地了解语言,例如Collection课程时,你很快就会遇到错误 - 次要或重大错误.

因此:避免与此类比较equals().