String,StringBuffer與StringBuilder區別

String是一個不可變的字符序列,一旦定義好,則無法再修改其內容,所謂修改,實際是修改了引用變量指向的字符串對象地址.在每一次做字符串拼接時實際都是在創建新的字符串對象,因此在做大量字符串拼接時會不斷創建新的對象,在效率上非常差;
StringBuffer跟String都是從CharSequence接口實現,StringBuffer是一個線程安全,可變的字符序列。 字符串緩衝區就像一個String ,但可以修改。 在任何時間點,它包含一些特定的字符序列,但可以通過某些方法調用來更改序列的長度和內容。 字符串緩衝區可以安全地被多個線程使用。 這些方法在必要時進行同步,以便任何特定實例上的所有操作都按照與所涉及的各個線程所執行的方法調用順序一致的順序發生。每次在進行字符串拼接時只是向原來序列中新增數據,並未反覆創建新對象,所以在拼接效率方面遠遠高於String,並且StringBuffer是線程安全的實現
StringBuilder一個可變的字符序列。 此類提供與StringBuffer的API,但不保證同步。 此類設計用作簡易替換爲StringBuffer在正在使用由單個線程字符串緩衝區的地方(如通常是這種情況).在可能的情況下,建議使用這個類別優先於StringBuffer ,因爲它在大多數實現中將更快。 StringBuilderStringBuffer共享相同的API(相同的方法),但是StringBuilder是線程不安全的實現,在多線程運行時效率比StringBuffer要高,但是對於字符串的安全性沒有保障
簡要的說, String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,然後指向新的 String 對象,所以經常改變內容的字符串最好不要用 String ,因爲每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。而如果是使用 StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下推薦使用 StringBuffer ,特別是字符串對象經常改變的情況下。而在某些特別情況下, String 對象的字符串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度並不會比 StringBuffer 對象慢,而特別是以下的字符串對象生成中, String 效率是遠要比 StringBuffer 快的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章