區別
1、StringBuffer 與 StringBuilder 中的方法和功能完全是等價的,
2、只是StringBuffer 中的方法大都采用了 synchronized 關鍵字進行修飾,因此是線程安全的,
而 StringBuilder 沒有這個修飾,可以被認為是線程不安全的。
3、在單線程程序下,StringBuilder效率更快,因為它不需要加鎖,不具備多線程安全
而StringBuffer則每次都需要判斷鎖,效率相對更低
實現原理
StringBuffer類繼承自AbstractStringBuilder抽象類,實現Serializable序列化接口和CharSequence接口。
AbstractStringBuilder抽象類實現Appendabel,CharSequence接口。
StringBuffer初始化及擴容機制
1.StringBuffer()的初始容量可以容納16個字符,當該對象的實體存放的字符的長度大於16時,實體容量就自動增加。StringBuffer對象可以通過length()方法獲取實體中存放的字符序列長度,通過capacity()方法來獲取當前實體的實際容量。
2.StringBuffer(int size)可以指定分配給該對象的實體的初始容量參數為參數size指定的字符個數。當該對象的實體存放的字符序列的長度大於size個字符時,實體的容量就自動的增加。以便存放所增加的字符。
3.StringBuffer(String s)可以指定給對象的實體的初始容量為參數字符串s的長度額外再加16個字符。當該對象的實體存放的字符序列長度大於size個字符時,實體的容量自動的增加,以便存放所增加的字符。


JVM StringBuffer實現
JVM內部采用了StringBuffer來連接字符串了,那么我們自己就不用用StringBuffer,直接用”+“就行了吧!“。是么?當然不是了。俗話說”存在既有它的理由”,讓我們繼續看后面的循環對應的字節碼。
因為每次執行“+”操作時jvm都要new一個StringBuffer對象來處理字符串的連接,這在涉及很多的字符串連接操作時開銷會很大。