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

Pra*_*mha 2 java string if-statement

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

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

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

上面的代码总是打印出来的false,好像我试着这样:

if("STring" == "STring") {
  System.out.println("true");
}
else {
  System.out.println("false");
}
Run Code Online (Sandbox Code Playgroud)

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

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

Roh*_*ain 5

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

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

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

"STring" == "STring"
Run Code Online (Sandbox Code Playgroud)

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

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