该程序的输出结果?
正确结果是:
true
false
对于String s1="a"+"bc",在编译期会优化成String s1="abc",生成的字节码看不到"a"和"bc";对于s2也会做同样的优化处理:String s2="abc"。s1和s2都指向常量池中的"abc",故s1==s2结果返回true。这种编译期的优化技术叫做常量折叠,其发生的条件是:必须是编译期常量之间进行运算才会进行常量折叠。编译期常量(编译的时候就可以确定其值的常量)有:
s3是两个非final的变量相加,不会发生常量折叠,而是根据 String 类特有的 + 运算符重载,变成类似这样的代码(jdk1.8.0_111,不同版本可能生成的字节码结果不一样):
String s3 = new StringBuilder(a).Append(bc).toString();
toString方法(源码如下图所示)会new一个新的String变量出来,使得s1==s3结果为false(如果对String a和String bc都使用final修饰,那么s1==s3的结果会因常量折叠而为true)。
为了更清晰的明白整个过程这里对题中字节码进行进行反编译,题中代码等价于:
字节码内容如下图所示:
JAVA修身之路,专注java学习和分享,不止java。