ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
![](https://img.kancloud.cn/9e/87/9e87ee90e73b5ca014c52cc0e2238848_1410x806.png) ---- 虚拟机使用-XX:+OptimizeStringConcat开启字符串拼接优化功能(默认开启),如果是`result.append(); result.append(); `这种格式则无法识别。 > 如果使用 `result += a; result += b; result += c; ` 这种形式,会生成三个StringBuilder对象,切忌使用。 ---- StringBuffer跟StringBuilder和相比性能并不差,得益于JIT C2阶段的逃逸分析和锁消除(对象只在方法内部使用,可以消除synchronized) - 逃逸分析:`-XX:+DoEscapeAnalysis` - 锁消除:`-XX:+EliminateLocks ` ---- 下面是字节码反编译的结果: ![](https://img.kancloud.cn/26/bd/26bd5e11db00219d470e76eaa6adf8f1_634x142.png) ![](https://img.kancloud.cn/09/fe/09fe83b14c5789d3db45cbb3d02b0545_694x142.png) ![](https://img.kancloud.cn/82/60/826041a1dbe2a7fb8d6f01f1a56013d5_1280x504.png) 对于+号连接的代码,编译时转换成StringBuilder,调用其append方法进行拼接,最后通过其toString()方法返回一个新的String对象。 ---- ![](https://img.kancloud.cn/35/b0/35b03403f07ef8db216f52d38a5e9810_1058x226.png) ![](https://img.kancloud.cn/97/d6/97d6ec70e72e3c310b1ea006cf0f75bc_1280x398.png) 再观StringBuilder链式拼接字符串生成的字节码,与+号拼接的一致。 ---- ![](https://img.kancloud.cn/59/88/59881124384f98661db8bc0833783e7e_644x308.png) ![](https://img.kancloud.cn/7e/a6/7ea60ee2bb58e3f1d6ac83b125f45695_1112x476.png) 而这种非链式操作的append,每次会从操作数栈中弹出,再从局部变量中装载引用类型值入栈。