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。
- 2) 不要使用String類的”+”來進行頻繁的拼接,因為那樣的效能極差的,應該使用StringBuffer或StringBuilder類,這在Java的優化上是一條比較重要的原則。例如:
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主要用在全域性變數中。
- 4) 相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的效能提升,但卻要冒多執行緒不安全的風險。而在現實的模組化程式設計中,負責某一模組的程式設計師不一定能清晰地判斷該模組是否會放入多執行緒的環境中執行,因此:除非確定系統的瓶頸是在 StringBuffer 上,並且確定你的模組不會執行在多執行緒模式下,才可以採用StringBuilder;否則還是用StringBuffer。
相關文章
- 【Java】String、StringBuilder和StringBufferJavaUI
- java String,StringBuilder和StringBufferJavaUI
- [Java]String、StringBuilder和StringBufferJavaUI
- String、StringBuilder和StringBufferUI
- Java字串(String_StringBuilder_StringBuffer)Java字串UI
- String和StringBuilder和StringBuffer三兄弟UI
- 第二十節:詳細講解String和StringBuffer和StringBuilder的使用UI
- String、StringBuffer和StringBuilder類的UI
- C# string、stringBuffer和stringBuilderC#UI
- java複習之 String,StringBuffer,StringBuilderJavaUI
- 【扯皮系列】一篇與眾不同的 String、StringBuilder 和 StringBuffer 詳解UI
- Java中String,StringBuffer和StringBuilder的區別(轉載)JavaUI
- String、StringBuffer、StringBuilder剖析UI
- Java中String/StringBuffer/StringBuilder區別(轉)JavaUI
- Java StringBuffer 和 StringBuilder 類JavaUI
- Java中String,StringBuffer,StringBuilder基礎知識JavaUI
- 認識Java中String與StringBuffer以及StringBuilderJavaUI
- Java容器深入淺出之String、StringBuffer、StringBuilderJavaUI
- String, StringBuilder, StringBuffer 之間的區別 - JavaUIJava
- String、StringBuffer、StringBuilder區別?UI
- String、StringBuffer、StringBuilder的理解UI
- String,StringBuffer,StringBuilder區別UI
- 從為什麼String=String談到StringBuilder和StringBufferUI
- Java 之String、StringBuffer 和 StringBuilder 三者區別介紹JavaUI
- StringBuilder StringBuffer String的區別(原始碼分析)-javaUI原始碼Java
- 老生常談 String、StringBuilder、StringBufferUI
- String,StringBuilder,StringBuffer的區別UI
- String、StringBuilder、StringBuffer的區別UI
- 正確使用String,StringBuffer,StringBuilderUI
- String、StringBuffer、StringBuilder的區別UI
- Java StringBuilder和StringBuffer原始碼分析JavaUI原始碼
- java中String、StringBuilder、StringBuffer三者的區別JavaUI
- StringBuffer和StringBuilderUI
- String,StringBuffer與StringBuilder的區別UI
- String、StringBuffer、與StringBuilder的區別UI
- String,StringBuffer與StringBuilder的區別??UI
- Java中的String,StringBuilder,StringBuffer三者的區別JavaUI
- 『Java 語法基礎』String、StringBuffer 與 StringBuilder 的區別JavaUI