有一段代码:
String a = "Hello", b = "Hello";
System.out.println("a==b: " + a==b);
System.out.println("a!=b: " + a!=b);
其输出以下值:
false
true
我知道运算符==
比较!=
引用,因此输出结果 (false, true),但我不明白字符串值从 string 到"a==b: "
哪里"a!=b: "
。我认为这里与类型转换有关,但我无法完全理解它。有人可以更具体地解释一下吗?
加法运算符的
+
优先级高于比较运算符==
。因此表达式被视为
也就是说,我们将两行相加,并将结果与 进行比较
b
,简单地得到答案false
。同样,对于我们使用运算符的情况
!=
:它的优先级也低于运算符的优先级+
。为了在屏幕上显示你想要的内容,字符串比较的结果必须放在括号中:
然后我们得到:
对于 的情况
!=
,也是如此。这是因为这样的记录已经被视为两个字符串的相加。第一行是
a==b
,第二行是布尔表达式false
/true
,一路上它被简化为一行。如果我们放弃这种运算符
+
、==
和的组合!=
,那么我们就不需要为预期输出放置括号。例如,如果我们使用以下方法比较字符串equals()
结果我们得到
显然,在这种情况下,内容已经
println()
很容易且明确地识别为两个字符串的相加。正如 @Enikeyshchik 正确指出的那样,对于相同的行
Hello
,和运算符Hello
产生的结果将分别为和。由于我上面描述的原因,你得到了相反的结果,而不是因为“链接比较”。==
!=
true
false
为什么操作员
==
会在这种情况下给出相同的行,true
可以在下一个答案中阅读。是的,这里运算的优先级决定了表达式的结果。但我想补充一下。
实际上,Java中有一个字符串池这样的东西。对于其值在程序运行之前已知的字符串,具有相同值的所有 String 变量都会收到对具有该值的同一对象的引用。就在编译期间,您已经知道 a 和 b 都等于“Hello”。因此,使用 equals() 方法的比较和使用 == 的比较都应该产生 true。