面试题【java中的常量折叠】该程序的输出结果?
文章插图
正确结果是:
true false
结果分析对于String s1="a"+"bc",在编译期会优化成String s1="abc",生成的字节码看不到"a"和"bc";对于s2也会做同样的优化处理:String s2="abc" 。s1和s2都指向常量池中的"abc",故s1==s2结果返回true 。这种编译期的优化技术叫做常量折叠,其发生的条件是:必须是编译期常量之间进行运算才会进行常量折叠 。编译期常量(编译的时候就可以确定其值的常量)有:- 字面量:数字字面量,字符串字面量等
- 编译期常量进行简单运算的结果:1+2,"a"+"b"等
- 被编译器常量赋值的final的基本类型和字符串变量等
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 。
推荐阅读
- docker 快速搭建JAVA开发环境
- 红楼梦中的薛宝钗是个怎样的人
- Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页
- JDK和JRE-Java运行环境全面介绍
- 一文让你读懂JAVA.IO、字符编码、URL和Spring.Resource
- 三国关羽败走麦城是现在哪里
- 教师|父母眼中的“铁饭碗”,我们应该听从吗?应该认可吗?
- 历史中的雍正是怎么死的
- Java通过shell脚本监控重启服务
- Java线程池深度揭秘