JDK1.5+ String加号编译未优化为StringBuilder,反编译无变化问题咨询
你看不到优化痕迹的核心原因是反编译工具自动做了语法糖还原,把字节码里的StringBuilder拼接逻辑重新转换成了String +的写法,和原代码一致不代表编译期没有做优化。
验证优化确实存在的方法
- 不要依赖反编译得到的Java代码,直接查看编译后class文件的字节码:执行命令
javap -v 你的类名.class,即可在输出中看到String拼接对应的new StringBuilder、append、toString调用,和你预期的优化逻辑完全一致。 - 如果一定要用反编译工具查看Java形式的优化结果,可以调整IDEA反编译的设置:关闭「将StringBuilder拼接还原为+运算符」的相关选项,反编译结果就会显示为StringBuilder调用的形式。
相关补充说明
- 纯字面量的String拼接(比如你代码里的
String str1 = "It's" + " a string" + "....";)会触发编译期常量折叠,编译器会直接把多个字面量合并为一个完整的字符串常量,不会生成StringBuilder相关逻辑,也不会在运行期做拼接操作,你可以通过str0 == str1得到true验证这一点。 - Java 8及之前版本的编译器不会对循环内的String拼接做批量优化,每次循环都会创建新的StringBuilder对象,所以如果有循环内大量拼接字符串的场景,推荐手动创建单个StringBuilder复用,减少对象创建开销。
内容的提问来源于stack exchange,提问作者creep
相关产品推荐
相关产品推荐

