字符串连接和比较在 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));
您已明确使用大括号将 str1
与 str2
(即 true
)进行比较,然后附加值。
传递给 println 的参数从左到右求值。
因此 "str1==str2 "+ str1
连接两个字符串,稍后将其与 str2
和 return 布尔值进行比较。
这是因为运算符的优先级。
在第一个语句中,+
运算符在 ==
和 "str1==str2 " 附加到 str1
之前执行,之后附加的结果与==
到 str2
.
在第二个语句中,方括号 ()
表示在顶级运算符(即 +
)发生之前应该计算的原子部分。这就是为什么首先将 str1
与 str2
与 ==
进行比较,然后将结果 (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
方法来完成。否则你比较它是否是相同的引用,而不是相同的值!
我无法理解以下行为,
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));
您已明确使用大括号将 str1
与 str2
(即 true
)进行比较,然后附加值。
传递给 println 的参数从左到右求值。
因此 "str1==str2 "+ str1
连接两个字符串,稍后将其与 str2
和 return 布尔值进行比较。
这是因为运算符的优先级。
在第一个语句中,+
运算符在 ==
和 "str1==str2 " 附加到 str1
之前执行,之后附加的结果与==
到 str2
.
在第二个语句中,方括号 ()
表示在顶级运算符(即 +
)发生之前应该计算的原子部分。这就是为什么首先将 str1
与 str2
与 ==
进行比较,然后将结果 (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
方法来完成。否则你比较它是否是相同的引用,而不是相同的值!