java中String、StringBuilder、StringBuffer三者的區別

林六天發表於2015-02-03

在Java專案開發中,字串是最長使用的資料型別,而有關字串的String、StringBuilder、StringBuffer三者又常常讓人分不清楚什麼時候該使用哪個。

特此整理一下。

String字串常量

    大家都知道String是一個不可變的類,任何對String的改變都會引發新的String物件的生成;因此在每次對 String 型別進行改變的時候其實都等同於生成了一個新的 String 物件,然後將指標指向新的 String 物件,所以經常改變內容的字串最好不要用 String ,因為每次生成物件都會對系統效能產生影響,特別當記憶體中無引用物件多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。

StringBuffer 字串變數(執行緒安全)
    為了彌補String類不可變的缺點,有了StringBuffer和StringBuilder類。這兩個類都是可變的,區別就在於一個是執行緒安全的,一個是非執行緒安全的。
    在一般情況下我們推薦使用 StringBuffer ,特別是字串物件經常改變的情況下。而在某些特別情況下, String 物件的字串拼接其實是被 JVM 解釋成了 StringBuffer 物件的拼接,所以這些時候 String 物件的速度並不會比 StringBuffer 物件慢,而特別是以下的字串物件生成中, String 效率是遠要比 StringBuffer 快的:
 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
 //你會很驚訝的發現,生成 String S1 物件的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不佔優勢。其實這是 JVM 的一個把戲,在 JVM 眼裡,這個
 String S1 = “This is only a” + “ simple” + “test”; 
//其實就是:
 String S1 = “This is only a simple test”;
// 所以當然不需要太多的時間了。但大家這裡要注意的是,如果你的字串是來自另外的 String 物件的話,速度就沒那麼快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
//這時候 JVM 會規規矩矩的按照原來的方式去做

 

StringBuilder 字串變數(非執行緒安全)
    StringBuilder一個可變的字元序列是5.0新增的。此類提供一個與 StringBuffer 相容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字串緩衝區被單個執行緒使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。

總結

    如果我們的程式是在單執行緒下執行,或者是不必考慮到執行緒同步問題,我們應該優先使用StringBuilder類;當然,如果要保證執行緒安全,自然非StringBuffer莫屬了。

 

相關文章