Java中println()内布尔表达式未加括号引发的异常输出问题
为什么Java中未加括号的表达式会导致意外输出?
嘿,这个问题的核心其实是Java运算符优先级在暗中影响执行顺序,完全超出你的预期很正常——毕竟AP级别的内容通常不会深入到这种细节!
让我们拆解一下你遇到的问题:
1. 未加括号时的执行逻辑
先看你最初的代码行:
System.out.println("t == s?" + t == s);
Java里,字符串拼接运算符+的优先级高于相等比较运算符==,所以这行代码的实际执行顺序是:
- 先执行字符串拼接:
"t == s?" + t,得到新字符串"t == s?Oh No!" - 再把这个新字符串和
s做==比较:"t == s?Oh No!" == "Oh No!"
虽然s和t指向常量池里的同一个字符串对象,但拼接出来的新字符串是在堆内存中创建的全新对象,和s的内存地址不一样,所以==比较的结果是false,这就是控制台第一个输出false的原因——你以为是输出拼接后的字符串加布尔值,但实际上是输出了这个比较的结果!
2. 加括号后的执行逻辑
当你给(t == s)加上括号后:
System.out.println("t == s?" + (t == s));
括号改变了执行优先级:
- 先执行括号里的
t == s,因为s和t指向同一个常量池对象,所以得到true - 再把这个布尔值和前面的字符串拼接:
"t == s?" + true,最终输出"t == s?true",这就符合你的预期了。
补充小提示
记住:==在Java中比较的是对象的内存地址,而不是内容(除非是基本类型)。如果要比较字符串内容,应该用equals()方法,但这里你的问题根源还是运算符优先级,不是字符串比较的方式~
内容的提问来源于stack exchange,提问作者user9791396
相关产品推荐
相关产品推荐

