
----
虛擬機使用-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,每次會從操作數棧中彈出,再從局部變量中裝載引用類型值入棧。