
----
虚拟机使用-XX:+OptimizeStringConcat开启字符串拼接优化功能(默认开启),如果是`result.append(); result.append(); `这种格式则无法识别。
> 如果使用 `result += a; result += b; result += c; ` 这种形式,会生成三个StringBuilder对象,切忌使用。
----
StringBuffer跟StringBuilder和相比性能并不差,得益于JIT C2阶段的逃逸分析和锁消除(对象只在方法内部使用,可以消除synchronized)
- 逃逸分析:`-XX:+DoEscapeAnalysis`
- 锁消除:`-XX:+EliminateLocks
`
----
下面是字节码反编译的结果:



对于+号连接的代码,编译时转换成StringBuilder,调用其append方法进行拼接,最后通过其toString()方法返回一个新的String对象。
----


再观StringBuilder链式拼接字符串生成的字节码,与+号拼接的一致。
----


而这种非链式操作的append,每次会从操作数栈中弹出,再从局部变量中装载引用类型值入栈。