字符串连接和比较在 println 语句中给出意外结果

String concatenation and comparison gives unexpected result in println statement

我无法理解以下行为,

String str1= "abc";
String str2 = "abc";

System.out.println("str1==str2 "+ str1==str2);
System.out.println("str1==str2 " + (str1==str2))

上述语句的输出如下:

false

str1==str2 true

为什么会这样?为什么输出不是如下所示:

str1==str2 true

str1==str2 true

+ has higher precedence than ==.
所以你的代码:

System.out.println("str1==str2 " + str1 == str2);

实际上是

System.out.println(("str1==str2 "+str1) == str2); 

所以,你得到 false

情况 2

System.out.println("str1==str2 " + (str1==str2));

您已明确使用大括号将 str1str2(即 true)进行比较,然后附加值。

传递给 println 的参数从左到右求值。

因此 "str1==str2 "+ str1 连接两个字符串,稍后将其与 str2 和 return 布尔值进行比较。

这是因为运算符的优先级。

在第一个语句中,+ 运算符在 == 和 "str1==str2 " 附加到 str1 之前执行,之后附加的结果与==str2.

在第二个语句中,方括号 () 表示在顶级运算符(即 +)发生之前应该计算的原子部分。这就是为什么首先将 str1str2== 进行比较,然后将结果 (true) 作为字符串附加到 "str1==str2 "

System.out.println("str1==str2 "+ str1==str2);

在上面的行中,编译器检查是否

"str1==str2"+str1

即>>> "str1==str2 str1"是否等于str2

That's why it prints it as false

比较两个字符串应该始终使用 equals 方法来完成。否则你比较它是否是相同的引用,而不是相同的值!