2

可能的重复:
Java 中的字符串比较和字符串实习

我对 Java 中的字符串比较有一点疑问,请考虑以下代码:

if("String".replace('t','T') == "String".replace('t','T')) {
  System.out.println("true");
}
else {
  System.out.println("false");
}

上面的代码总是 print's false,好像我这样尝试:

if("STring" == "STring") {
  System.out.println("true");
}
else {
  System.out.println("false");
}

它总是会打印我true。是的,我知道字符串比较应该用String.equals() or equalsIgnoreCase()方法来完成。但这是面试中被问到的问题之一,我很困惑。谁能指导我这种行为?

据我所知,在代码片段 1 中,"String.replace('t','T')正在返回对象,因此对象比较返回 false。我对吗?

4

6 回答 6

5

“String.replace('t','T') 正在返回对象,因此对象比较返回 false。我说的对吗?

是的,至于这种情况,你是对的。String#replace(或 String 类的任何方法),将返回一个新的 String 对象(你可以猜到为什么?不变性)。因此,您必须使用equals方法进行比较,以比较它们的内容。

现在,在第二种情况下: -

"STring" == "STring"

您正在比较两个字符串文字。现在,由于String 文字是在 Java 中实习的,所以两个文字都是相同的(从某种意义上说,它们指向相同的内存位置),因此==比较会给你true.

使用==and进行比较的区别equals在于,==比较参考值- 即对象的内存位置值,对于两个不同的字符串对象,这将是不同的,就像您在第一种情况下所拥有的那样。然而,equals比较这些对象中的实际内容。

于 2013-01-08T07:41:57.650 回答
4

“String.replace('t','T') 正在返回对象,因此对象比较返回 false。我说的对吗?

是的,==比较对象引用,您的第一个代码是比较两个不同的对象。

就第二个代码而言,它是由于字符串实习。

于 2013-01-08T07:38:14.300 回答
1

好的,让我们这样做,您的两个字符串对象“字符串”都引用同一个对象。所以他们“基本上”是平等的。这是编译器为你做的事情

但是方法 replace 确实创建并返回了一个新的 String 对象,这就是您的第二个代码不相等的原因。

于 2013-01-08T07:42:46.727 回答
0

Java在使用. int_ byte_==

java 编译器优化您输入的两个字符串常量以使用相同的对象,因此相同的引用,因此==返回 true

于 2013-01-08T07:41:14.500 回答
-1

这样做

("String".replace('t','T').Tostring() ==  ("String".replace('t','T')).ToString()

这将解决您的问题,因为替换语句应在评估之前转换为字符串。

您也可以为此使用 String.Equals 或更好地使用您在问题中提到的忽略大小写。

于 2013-01-08T07:39:43.537 回答
-1

试试这个:

如果(string1.equals(string2)){

...

}

于 2013-01-08T07:39:46.960 回答