【问题标题】:Comparing an object with a String using equals() method使用 equals() 方法将对象与字符串进行比较
【发布时间】:2015-05-27 14:34:08
【问题描述】:

在下面的示例中,我期望 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() 方法,据说将Strings 与Objects 进行比较。为什么我得到的结果为false,尽管它们是相同的?

【问题讨论】:

  • 看看Object类中定义的equals()的实现。
  • 它们不相同。他们甚至不是同一个班级。一个属性的值与另一个属性相等(但不相同)。这远远不足以满足equals()。
  • 这是我的车。 (想象一下欧宝 Corsa。)这是倍耐力 PT-1004 轮胎。 (想象一下 Pirelli PT-1004 轮胎。)我的车绝对不等于轮胎,尽管我的车确实碰巧穿着 Pirelli PT-1004轮胎。即使你偷了我的 3 个轮胎,只留给我一个,这也不是平等的。它不会。曾经。等于。到轮胎。
  • 你为什么不去 Stack Overflow 问问,你在question blocked 那里吗? meta.stackexchange.com/a/129632/165773
  • @MikeNakis:“它不会。永远。平等。轮胎。”如果您的汽车和轮胎定义equals(),则它们可以相互相等。

标签: java language-features comparison


【解决方案1】:

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

@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:

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

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

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

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

当然,您仍然可以违反约定,但是当您了解有关该语言的更多信息时,您可能很快就会遇到错误 - 小错误或大错误,例如Collection 类。

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

【讨论】:

    【解决方案2】:

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

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

    one.name.equals("Flower")
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2018-09-07
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多