區別算法
一、StringBuffer 與 StringBuilder 中的方法和功能徹底是等價的,安全
二、只是StringBuffer 中的方法大都採用了 synchronized 關鍵字進行修飾,所以是線程安全的,多線程
而 StringBuilder 沒有這個修飾,能夠被認爲是線程不安全的。 app
三、在單線程程序下,StringBuilder效率更快,由於它不須要加鎖,不具有多線程安全jvm
而StringBuffer則每次都須要判斷鎖,效率相對更低ui
實現原理spa
StringBuffer類繼承自AbstractStringBuilder抽象類,實現Serializable序列化接口和CharSequence接口。線程
AbstractStringBuilder抽象類實現Appendabel,CharSequence接口。對象
StringBuffer初始化及擴容機制blog
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對象來處理字符串的鏈接,這在涉及不少的字符串鏈接操做時開銷會很大。