<返回更多

java中的常量折叠

2020-08-14    
加入收藏

面试题

该程序的输出结果?

通过一道String面试题了解java中的常量折叠

 

正确结果是:

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)。

通过一道String面试题了解java中的常量折叠

 

为了更清晰的明白整个过程这里对题中字节码进行进行反编译,题中代码等价于:

通过一道String面试题了解java中的常量折叠

 

字节码内容如下图所示:

通过一道String面试题了解java中的常量折叠

 

JAVA修身之路,专注java学习和分享,不止java。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>