我一直在寻找有关Java如何处理字符串存储和println()函数的几个细节,最终我创建了这个:

String s = "Oh No!";
String t = s;
System.out.println("t == s?" + t == s);
System.out.println(t == s);


控制台打印:

false
true


我希望条件成立,因为这两个对象显然引用了相同的内存位置。但是println不仅会忽略“ t == s”吗?串;似乎将布尔值转换为false!自然地,当我在第一个println的(t == s)布尔值周围加上括号时,显示结果与预期的一样:

t == s?true
true


我的问题是:为什么在第一个布尔值周围缺少括号不仅会打印false,还会导致println忽略“ t == s”?

这与众不同,并且违背了我对Java的理解(作为基准,我认为它略高于AP级别)。

最佳答案

操作顺序很重要,在这里

System.out.println("t == s?" + t == s);


相当于

System.out.println(("t == s?" + t) == s);


您在比较之前将t添加到String。你期望

System.out.println("t == s?" + (t == s));


您还可以使用格式化的io来确保操作顺序(并消除隐式的StringBuilder)。喜欢,

System.out.printf("t == s?%b%n", t == s);

07-25 23:49
查看更多