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

可能重复:
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比较应该用String.equals() or equalsIgnoreCase()方法完成。 但这是在采访中提出的问题之一,我很困惑。 任何人都可以指导我这种行为吗?

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

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

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

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

 "STring" == "STring" 

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

使用==equals进行比较的差异在于, ==比较参考值 – 即对象的内存位置值,对于两个不同的字符串对象,它们将在第一种情况下不同。 而equals比较这些对象中的实际内容。

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

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

至于第二个代码是由于字符串实习而引起的。

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

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

当使用==时,Java总是比较基本类型( intbyte等)或对象的引用

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

这样做

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

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

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

尝试这个:

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

}