为什么==运算符与引用的行为不同于原始数据类型?
String string1 = "myString";
String string2 = "myString";
int num1 = 10;
int num2 = 10;
System.out.println("Value is "+string1==string2); //WORKS FINE
System.out.println("Value is "+num1==num2); //COMPILE TIME ERROR
我无法弄清楚这背后的任何合理原因。
PS:故意不使用打印声明中的括号
谢谢:))
答案 0 :(得分:10)
这是operator precedence的问题。您的第二个印刷语句被解释为:
System.out.println(("Value is "+num1)==num2); // notice the parenthesis
尝试将字符串与int进行比较,从而产生编译时错误。添加括号以解决问题:
System.out.println("Value is " + (num1==num2)); // compiles
Operators中列出了Java运算符的优先级。
现在,这个:
// original:
System.out.println("Value is "+string1==string2);
// equivalent to:
System.out.println(("Value is "+string1)==string2);
有效,因为"Value is "+string1
本身就是一个字符串,因此将string2
与==
进行比较是有效的。
答案 1 :(得分:2)
这是因为operator precedence
你不能将字符串与int进行比较。
问题1:
System.out.println("Value is "+num1==num2);
+
符号的优先级高于==
,因此它首先执行+
,然后执行==
执行+
后,这是结果:
System.out.println("Value is 10"==num2); //num1 is appended to the string
问题2:
"Value is 10"==num2
这是编译错误的来源,字符串不能与int进行比较。
<强>溶液强>
如果你想首先比较int,你需要将它包装在括号内以避免编译时错误
System.out.println("Value is "+ (num1==num2));