這篇文章主要介紹了Java 中String StringBuilder 與StringBuffer詳解及用法實例的相關資料,需要的朋友可以參考下
在Android/Java開發中,用來處理字串常用的類別有3種: String、StringBuilder、StringBuffer。
它們的異同點:
1) 都是final 類別, 都不允許被繼承;
2) String 長度是不可變的, StringBuffer、StringBuilder 長度是可變的;
3) StringBuffer 是線程安全的, StringBuilder 不是線程安全的。
String VS StringBuffer
String 類型和StringBuffer的主要效能區別:String是不可變的物件, 因此在每次對String 類型進行改變的時候,都會產生一個新的String 對象,然後將指針指向新的String 對象,所以經常改變內容的字串最好不要用String ,因為每次生成對像都會對系統效能產生影響,特別當記憶體中無引用物件多了以後, JVM 的GC 就會開始運作,效能就會降低。
使用 StringBuffer 類別時,每次都會對 StringBuffer 物件本身進行操作,而不是產生新的物件並改變物件參考。所以多數情況下推薦使用 StringBuffer ,特別是字串物件經常改變的情況。
在某些特別情況下, String 物件的字串拼接其實就是被Java Compiler 編譯成了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慢。其實在Java Compiler裡,自動做了以下轉換:
Java Compiler直接把上述第一個語句編譯成:
String s2 = “This is only a”; String s3 = “ simple”; String s4 = “ test”; String s1 = s2 + s3 + s4;##這時候,Java Compiler會規規矩矩的按照原來的方式去做,String的concatenation(即+)操作利用了StringBuilder(或StringBuffer)的append方法實現,此時,對於上述情況,若s2,s3,s4採用String定義,拼接時需要額外建立一個StringBuffer(或StringBuilder),之後將StringBuffer轉換為String;若採用StringBuffer(或StringBuilder),則不需額外建立StringBuffer。
StringBuilder
StringBuilder是5.0新增的。此類別提供一個與 StringBuffer 相容的 API,但不保證同步。該類別被設計用作 StringBuffer 的一個簡易替換,用在字串緩衝區被單一執行緒使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實作中,它比 StringBuffer 更快。兩者的方法基本上相同。使用策略
1) 基本原則:如果要操作少量的數據,用String ;單執行緒操作大量數據,用StringBuilder ;多執行緒操作大量數據,用StringBuffer。String result = ""; for (String s : hugeArray) { result = result + s; } // 使用StringBuilder StringBuilder sb = new StringBuilder(); for (String s : hugeArray) { sb.append(s); } String result = sb.toString();當出現上面的情況時,顯然我們要採用第二種方法,因為第一種方法,每次迴圈都會建立一個String result用來保存結果,除此之外二者基本上相同.3) StringBuilder一般使用在方法內部來完成類似」+」功能,因為是執行緒不安全的,所以用完以後可以丟棄。 StringBuffer主要用在全域變數中。