Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用equals()方法将对象与字符串进行比较_Java_Language Features_Comparison - Fatal编程技术网

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")