Java 使用equals()方法将对象与字符串进行比较
在下面的示例中,我希望Java 使用equals()方法将对象与字符串进行比较,java,language-features,comparison,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 isSam
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
。。。是因为我在比较一个对象和一个字符串?我阅读了equals()
方法,据说是将String
s与对象进行比较。为什么我得到的结果是false
,尽管它们是相同的 简短的回答是:您需要在Flower
(注意:大写F
)类中重写equals()
的实现。这将做一些您喜欢做的事情:
将hashCode()
与equals()
一起重写是一种很好的形式:通常,在hashCode()
计算中也应该使用为执行equals()
选择的“属性”(例如字段)。用外行的话说,他们应该彼此“同意”
正如我猜想这里几乎每个人都指出的那样,大/大/严重的问题是equals()
意味着:
它是对称的:对于任何非空参考值x
和y
,x.equals(y)
当且仅当y.equals(x)
返回true时,才应返回true
不幸的是,对于您的Flower
类,String.equals(Object)
被定义为:
结果为true
当且仅当参数不是null
并且是一个字符串
对象,该对象表示与此对象相同的字符序列。(强调矿山)
这意味着当您将Flower
对象传递给equals()
时,任何字符串都不会返回true
当然,您仍然可以违反约定,但是当您进一步了解该语言时,很快您就会遇到小错误或大错误,例如集合
类
因此:避免与equals()
进行此类比较,因为Killian说您正在将包含字符串属性的Flower对象与字符串进行比较
如果要查看Flower对象的name属性是否等于字符串,则需要检查实际字符串
one.name.equals("Flower")
我认为这是一个非常糟糕的主意,因为Flower对象不是字符串对象,它只包含一个字符串对象,所以您不会将like与like进行比较。看看object类中定义的equals()
的实现。它们不一样。他们甚至不是同一类人。一个属性的值等于另一个(但不相同)。这离满足equals()
还差得很远。这是我的车。(想象一下欧宝Corsa。)这是倍耐力PT-1004轮胎。(想象一个倍耐力PT-1004轮胎。)我的车肯定比不上这个轮胎,尽管我的车确实碰巧穿了倍耐力PT-1004轮胎。即使你偷了我的三个轮胎,只留下一个轮胎,这也不公平。不会的。曾经平等。你为什么不在堆栈溢出处询问,你在吗@MikeNakis:“它永远不会等于轮胎。”如果你的汽车和轮胎定义了equals()
,这样它们就可以彼此相等了。
one.name.equals("Flower")