1. 程式人生 > >Sring(二):String,StringBuffer與StringBuilder的區別

Sring(二):String,StringBuffer與StringBuilder的區別

一、String

字串廣泛應用 在Java 程式設計中,在 Java 中字串屬於物件,Java 提供了 String 類來建立和操作字串。

串也是資料結構的一種

需要注意的是,String的值是不可變的,這就導致每次對String的操作都會生成新的String物件,這樣不僅效率低下,而且大量浪費有限的記憶體空間。我們來看一下這張對String操作時記憶體變化的圖:

我們可以看到,初始String值為“hello”,然後在這個字串後面加上新的字串“world”,這個過程是需要重新在棧堆記憶體中開闢記憶體空間的,最終得到了“hello world”字串也相應的需要開闢記憶體空間,這樣短短的兩個字串,卻需要開闢三次記憶體空間,不得不說這是對記憶體空間的極大浪費。為了應對經常性的字串相關的操作,谷歌引入了兩個新的類——StringBuffer類和StringBuild類來對此種變化字串進行處理。

二、StringBuffer 和 StringBuilder

當對字串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。

和 String 類不同的是,StringBuffer 和 StringBuilder 類的物件能夠被多次的修改,並且不產生新的未使用物件。

StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是執行緒安全的(不能同步訪問)。

由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。

然而在應用程式要求執行緒安全的情況下,則必須使用 StringBuffer 類。

三者的繼承結構

二、三者比較

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0
}

都有char陣列 成員

(1)字元修改上的區別(主要)

String:不可變字串;

StringBuffer:可變字串、效率低、執行緒安全(在方法上加synchronized);

StringBuilder:可變字元序列、效率高、執行緒不安全;

(2)初始化上的區別,String可以空賦值,後者不行,報錯

①String

StringBuffer s = null;   

StringBuffer s = “abc”;   

②StringBuffer

StringBuffer s = null; //結果警告:Null pointer access: The variable result can only be null at this location

StringBuffer s = new StringBuffer();//StringBuffer物件是一個空的物件

StringBuffer s = new StringBuffer(“abc”);//建立帶有內容的StringBuffer物件,物件的內容就是字串”

小結:

(1)如果要操作少量的資料用 String;

(2)多執行緒操作字串緩衝區下操作大量資料 StringBuffer(目前已經不推薦使用);

(3)單執行緒操作字串緩衝區下操作大量資料 StringBuilder(推薦使用)。