2015-05-27 36 views
-2

在下面的例子相比较,我期待equals()返回true对象使用的equals()的字符串方法

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虽然它们是一样的?

+1

看看在Object类中定义的equals()的实现。 – 2015-05-27 14:35:01

+3

他们**不是**相同。他们甚至不是同一个班级。其中一个属性的值与另一个值相等(但不相同)。这远不足以满足'equals()'。 –

+0

这是我的车。 (想象一下欧宝Corsa。)这是一辆倍耐力PT-1004轮胎。 (想象一下倍耐力PT-1004轮胎。)尽管我的车实际上穿着倍耐力PT-1004轮胎,但我的汽车与轮胎绝对不是同等的***。即使你偷了我的3个轮胎并且只剩下一个轮胎,它也不会相同。它不会。永远。等于。对轮胎。 –

回答

7

简而言之:您需要在您的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

这是对称:对于任何非空当且仅当y.equals(x)返回true时,参考值xy,x.equals(y)应该返回true。

而且不幸的是,你的Flower类,String.equals(Object)定义as such

结果是true当且仅当参数不是null,是一个String对象,表示同样的字符序列作为这个对象。 (重点煤矿)

这意味着没有String永远不会返回true当你传递一个Flower对象equals()

当然,你仍然可以违背该公约,但你可能会遇到错误 - 或大或小 - 很快,当你了解更多的语言,例如Collection类。

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

1

由于Killian说你正在比较一个包含字符串属性的Flower对象到一个字符串。

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

one.name.equals("Flower") 

认为这将是一个非常糟糕的主意,因为花的对象不是一个String对象,它仅仅包含一个字符串对象,这样你就不会比较类似。

相关问题