String s1="hi";
String s2="hi";
boolean b1 = true;
boolean b2 = false;
(1) System.out.println(s1==s2); //true
(2) System.out.println(s1==s2 + s1==s2); //false
(3) System.out.println(s1==s2+ " " + s1==s2); //false
(4) System.out.println(b1+b2); //error : bad operand types
(5) System.out.println(b1 + " " + b2); //true false
(6) System.out.println(true +" "+ s1==s2); //false
答案 0 :(得分:12)
除了4之外,所有这些都依赖于运算符优先级。
在Java中,+
优先于==
。
这意味着2实际上是“读”:
s1 == ((s2 + s1) == s2)
因此,第一个==
的右侧操作数是一个布尔表达式,它将两个对象引用相互比较(事实上它们String
在这里是无关紧要的)这里它们不是相同。因此,右侧操作数是布尔值false
。
但由于左侧操作数是String
,并且由于==
不适用于操作数String
和boolean
,因此会产生编译错误。 JLS, section 15.21:
可以使用相等运算符将两个可转换的操作数(第5.1.8节)与数值类型,或两个类型为boolean或Boolean的操作数,或两个操作数(分别为引用类型或null类型)进行比较。所有其他情况都会导致编译时错误。
如果这真的为你编译,你正在使用一个有缺陷的Java编译器,它将右侧操作数自动装箱到Boolean
,它不应该。让我猜一下:Eclipse的ECJ?
4是错误,因为+
运算符不接受boolean
s作为操作数。
3读取与2几乎相同,只是这次s2 + " " + s1
与s2
进行比较(尝试)。由于同样的原因,它无法编译。
在5中,由于字符串连接,布尔值被自动装箱。
6再次依赖于2中提到的运营商优先级;这次是字符串true + " " + s1
,它是(引用)与s2
比较(并且给出了假)。有关true
的内容,请参阅5。
答案 1 :(得分:0)
What is the difference between (2) & (4)?
你的第二个陈述只是System.out.println(hi == hihi ==hi);
而答案是假的,但你的第四个陈述是直截了当的
What is the difference between (3) & (5)?
这与您之前的问题相同
Why it gives result false in (3) & (6)?
您的第3个语句遵循上述内容,其中第6个语句转换为System.out.println("true hi" =="hi");
且输出为false
P.S:'+'运算符在运算符先行
中排在第一位答案 2 :(得分:0)
1)(2)&的区别是什么? (4)?
答案: - ==有更多优先于+所以第二个实际上读作“s1 ==((s2 + s1)== s2)”我们甚至无法想象(布尔值+布尔值)
2)(3)&的区别是什么? (5)?
Ans: - 第3个甚至不会编译,第5个是简单的put值b1 = true和b2 = false并且执行简单的字符串连接