【问题标题】:String concatenation and comparison gives unexpected result in println statement字符串连接和比较在 println 语句中给出了意外的结果
【发布时间】:2015-11-25 11:02:09
【问题描述】:
我无法弄清楚以下行为,
String str1= "abc";
String str2 = "abc";
System.out.println("str1==str2 "+ str1==str2);
System.out.println("str1==str2 " + (str1==str2))
上述语句的输出如下:
假
str1==str2 真
为什么会这样?为什么输出不如下:
str1==str2 真
str1==str2 真
【问题讨论】:
标签:
java
string
operator-precedence
【解决方案1】:
+ 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)进行比较,然后附加该值。
【讨论】:
-
@OP 还有更多关于 Operator Precedence 的信息,请参考这个 java doc
【解决方案2】:
传递给 println 的参数从左到右计算。
因此"str1==str2 "+ str1 连接两个字符串,稍后将它们与str2 进行比较并返回一个布尔值。
【解决方案3】:
这是因为运算符优先级。
在第一条语句中,+ 运算符在== 之前执行,并且“str1==str2”附加到str1,之后将附加结果与== 进行比较到str2 .
在第二个语句中,括号() 表示在顶级运算符(即+)发生之前应该评估的原子片段。这就是为什么首先将str1 与str2 与== 进行比较,然后将结果(true)作为字符串附加到"str1==str2 "
【解决方案4】:
System.out.println("str1==str2 "+ str1==str2);
在上述行中,编译器检查是否
"str1==str2"+str1
即 >>> "str1==str2 str1" 是否等于 str2
这就是为什么它打印为假
【解决方案5】:
应该始终使用equals 方法比较两个字符串。否则你比较它是否是相同的引用,而不是相同的值!