Fuz*_*z X -2 java comparison language-features
在下面的例子中,我期待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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到的结果是false...是因为我正在将一个对象与一个对象进行比较String?我读了这个equals()方法,据说用Strings 比较Objects.为什么我得到结果false虽然它们是相同的?
答案很简单:你需要重写的执行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();
}
Run Code Online (Sandbox Code Playgroud)
重写hashCode()加上equals()好形式:通常,在"属性"(例如字段)你选择做一个equals()应该在你使用hashCode()的计算了.通俗地说,他们应该"同意"彼此.
该大/大/严重的问题,正如几乎所有人在这里我推测指出,被认为equals()意味着是对称的:
它是对称的:对于任何非空引用值
x和y,x.equals(y)应真,当且仅当返回y.equals(x)返回true.
不幸的是,对于你的Flower班级,String.equals(Object)定义如下:
结果是
true当且仅当参数不是null并且是一个String表示与该对象相同的字符序列的对象时.(强调我的)
这意味着当您将对象传递给时,String将不会返回.trueFlowerequals()
当然,你仍然可以违背惯例,但是当你更多地了解语言,例如Collection课程时,你很快就会遇到错误 - 次要或重大错误.
因此:避免与此类比较equals().