使用 equals() 方法比较一个对象和一个字符串
Comparing an object with a String using equals() method
在下面的例子中,我期望 equals()
到 return 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
s和Objects
。为什么我得到的结果是 false
,尽管它们是一样的?
简短的回答:您需要在 Flower
中重写 equals()
的实现(注意:大写 F
)class。这会做一些你喜欢做的事情:
@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()
的 'attributes'(例如字段)应该用于您的 hashCode()
计算过。通俗地说,他们应该'agree'彼此。
big/major/severe 问题,正如我想这里几乎每个人都指出的那样,equals()
意味着 symmetric:
It is symmetric: for any non-null reference values x
and y
, x.equals(y)
should return true if and only if y.equals(x)
returns true.
不幸的是,对于您的 Flower
class,String.equals(Object)
被定义为 as such:
The result is true
if and only if the argument is not null
and is a String
object that represents the same sequence of characters as this object. (emphasis mine)
这意味着当您将 Flower
对象传递给 equals()
时,没有 String
会 return true
。
当然,您仍然可以违反惯例,但您很可能会 运行 遇到错误 - 小错误或大错误 - 当您了解更多有关该语言的信息时,例如Collection
classes。
因此:避免与 equals()
.
进行此类比较
正如 Killian 所说,您正在将包含字符串属性的 Flower 对象与字符串进行比较。
如果您想查看 Flower 对象的名称属性是否等于您需要检查实际字符串的字符串。
one.name.equals("Flower")
认为这将是一个非常糟糕的主意,因为 Flower 对象不是字符串对象,它仅包含一个字符串对象,因此您不能进行同类比较。
在下面的例子中,我期望 equals()
到 return 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
s和Objects
。为什么我得到的结果是 false
,尽管它们是一样的?
简短的回答:您需要在 Flower
中重写 equals()
的实现(注意:大写 F
)class。这会做一些你喜欢做的事情:
@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()
的 'attributes'(例如字段)应该用于您的 hashCode()
计算过。通俗地说,他们应该'agree'彼此。
big/major/severe 问题,正如我想这里几乎每个人都指出的那样,equals()
意味着 symmetric:
It is symmetric: for any non-null reference values
x
andy
,x.equals(y)
should return true if and only ify.equals(x)
returns true.
不幸的是,对于您的 Flower
class,String.equals(Object)
被定义为 as such:
The result is
true
if and only if the argument is notnull
and is aString
object that represents the same sequence of characters as this object. (emphasis mine)
这意味着当您将 Flower
对象传递给 equals()
时,没有 String
会 return true
。
当然,您仍然可以违反惯例,但您很可能会 运行 遇到错误 - 小错误或大错误 - 当您了解更多有关该语言的信息时,例如Collection
classes。
因此:避免与 equals()
.
正如 Killian 所说,您正在将包含字符串属性的 Flower 对象与字符串进行比较。
如果您想查看 Flower 对象的名称属性是否等于您需要检查实际字符串的字符串。
one.name.equals("Flower")
认为这将是一个非常糟糕的主意,因为 Flower 对象不是字符串对象,它仅包含一个字符串对象,因此您不能进行同类比较。