有一段代码:
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产生的结果将分别为和。由于我上面描述的原因,你得到了相反的结果,而不是因为“链接比较”。==!=truefalse为什么操作员
==会在这种情况下给出相同的行,true可以在下一个答案中阅读。是的,这里运算的优先级决定了表达式的结果。但我想补充一下。
实际上,Java中有一个字符串池这样的东西。对于其值在程序运行之前已知的字符串,具有相同值的所有 String 变量都会收到对具有该值的同一对象的引用。就在编译期间,您已经知道 a 和 b 都等于“Hello”。因此,使用 equals() 方法的比较和使用 == 的比较都应该产生 true。