字符串比较结果的差异b / w ==和字符串#替换为==

时间:2013-01-08 07:36:27

标签: java string if-statement

  

可能重复:
  String comparison and String interning in Java

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

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

以上代码始终打印false,就像我尝试这样:

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

它会始终打印我true。是的,我知道字符串比较应该用String.equals() or equalsIgnoreCase()方法完成。但这是在采访中提出的问题之一,我很困惑。任何人都可以指导我这种行为吗?

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

6 个答案:

答案 0 :(得分:5)

  

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

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

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

"STring" == "STring"

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

使用==equals进行比较的差异在于,==比较参考值 - 即对象的内存位置值,即不同的是两个不同的字符串对象,就像你在第一种情况下一样。然而,equals比较了这些对象中的实际内容。

答案 1 :(得分:4)

  

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

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

就第二个代码而言,由于string interning.

答案 2 :(得分:1)

好吧让我们这样做,你们两个String对象“String”都指向同一个对象。 所以他们“基本”平等。这是编译器为您做的事情

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

答案 3 :(得分:0)

使用int时,Java始终会比较对象的基本类型(byte==等)或引用

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

答案 4 :(得分:-1)

这样做

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

这将解决您的问题,因为在eveluation之前应该将replace语句转换为字符串。

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

答案 5 :(得分:-1)

试试这个:

如果(string1.equals(字符串2)){

...

}