天天看點

String 與 StringBuffer類

String類用來表示那些建立後就不會再改變的字元串,它是immutable的。

而StringBuffer類用來表示内容可變的字元串,并提供了修改底層字元串的方法。

       當我們進行字元拼接時,請使用StringBuffer類而非String類,因為前者将比後者快上百倍。

的确,在程式的太多場合我們都會進行字元串拼接工作,簡單的代碼示例如下:

String str="You are nice.";

str+="I love you so much.";

如果用StringBuffer類的話,代碼如下:

StringBuffer str= new StringBuffer("You are nice.");

str.append("I love you so much.");

從表面看來String類隻用一個加号(+)便完成了字元串的拼接,而StringBuffer類卻要調用一個append()方法,是否實作起來更簡潔,更單純呢?其實不然,讓我們了解一下程式運作内部發生了哪些事情:

經編譯後程式的bytecode(位元組碼)展示出了實質:  在用String類對象直接拼接,JVM會建立一個臨時的StringBuffer類對象,并調用其append()方法完成字元串的拼接,這是因為String類是不可變的,拼接操作不得不使用StringBuffer類(并且--JVM會将"You are nice."和"I love you so much."建立為兩個新的String對象)。

之後,再将這個臨時StringBuffer對象轉型為一個String,代價不菲!可見,在這一個簡單的一次拼接過程中,我們讓程式建立了四個對象:兩個待拼接的String,一個臨時StringBuffer,和最後将StringBuffer轉型成為的String--它當然不是最初的str了,這個引用的名稱沒變,但它指向了新的String對象。

而如果直接使用StringBuffer類,程式将隻産生兩個對象:

最初的StringBuffer和拼接時的String("I love you so much."),也不再需要建立臨時的StringBuffer類對象而後還得将其轉換回String對象。

可以想象,當我們的字元串要被循環拼接若幹段時,用String類直接操作會帶來多少額外的系統開銷,生成多少無用的臨時StringBuffer對象,并處理多少次無謂的強制類型轉換哪。

繼續閱讀