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

时间:2015-05-27 14:34:09

标签: java language-features comparison

在下面的示例中,我希望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);
    }
} 

但是,我得到的结果是false ...是因为我正在将对象与String进行比较?我阅读equals()方法,据说将StringObjects进行比较。为什么我得到的结果为false,尽管它们是相同的?

2 个答案:

答案 0 :(得分: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();
}

hashCode()equals()一起覆盖是一种良好的形式:通常,您选择执行equals()的“属性”(例如字段)应该在hashCode()中使用计算也。通俗地说,他们应该“同意”彼此。

大/重大/严重问题,正如我所假设的几乎所有人所指出的那样,equals()应该是symmetric

  

对称:对于任何非空参考值xyx.equals(y)当且仅当y.equals(x)时才会返回true返回true。

不幸的是,Flower课程String.equals(Object)定义为as such

  

结果为true 当且仅当 参数不是null并且是String对象代表与此对象相同的字符序列。 (强调我的)

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

当然,您仍然可以违反惯例,但是当您了解有关该语言的更多内容时,您很快就会遇到错误 - 次要或重大错误,例如: Collection个班。

因此:避免与equals()进行此类比较。

答案 1 :(得分:1)

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

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

one.name.equals("Flower")

认为这是一个非常糟糕的主意,因为Flower对象不是一个字符串对象,它只包含一个字符串对象,因此你不会像喜欢那样比较。