1. 程式人生 > >StringBuffer與StringBuilder的區別,實現原理和擴容

StringBuffer與StringBuilder的區別,實現原理和擴容

StringBuffer與StringBuilder的區別,及實現原理

區別

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個字元時,實體的容量自動的增加,以便存放所增加的字元。

 

擴容演算法: 使用append()方法在字串後面追加東西的時候,如果長度超過了該字串儲存空間大小了就需要進行擴容:構建新的儲存空間更大的字串,將久的複製過去;   再進行字串append新增的時候,會先計算新增後字串大小,傳入一個方法:ensureCapacityInternal 這個方法進行是否擴容的判斷,需要擴容就呼叫expandCapacity方法進行擴容 嘗試將新容量擴為大小變成2倍+2   if 判斷一下 容量如果不夠,直接擴充到需要的容量大小。

JVM StringBuffer實現

 JVM內部採用了StringBuffer來連線字串了,那麼我們自己就不用用StringBuffer,直接用”+“就行了吧!“。是麼?當然不是了。俗話說”存在既有它的理由”,讓我們繼續看後面的迴圈對應的位元組碼。

因為每次執行“+”操作時jvm都要new一個StringBuffer物件來處理字串的連線,這在涉及很多的字串連線操作時開銷會很大。