在下面的示例中,我希望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()
方法,据说将String
与Objects
进行比较。为什么我得到的结果为false
,尽管它们是相同的?
答案 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:
对称:对于任何非空参考值
x
和y
,x.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对象不是一个字符串对象,它只包含一个字符串对象,因此你不会像喜欢那样比较。