2011年4月9日 星期六

[Java]String串接與StringBuilder(or StringBuffer)

之前聽人家說,由於 Java 沒有提供修改字串內容的 method,所以字串串接過程中會產生很多字串,因此不當使用時會消耗很多系統資源,改善方法就是要用 StringBuilder (若需考慮 Thread-Safe 則用 StringBuffer, 下面不再重述)


也許是我當初沒聽清楚,或是沒聽完整,或是沒搞懂,且也沒去看文件,總之後來我以為只要是字串串接就會有這種情況,因此像下面這樣的語法

String s = x + y + z;

我也會覺得要用下面這樣寫會比較好

String s = new StringBuilder(x).append(y).append(z);

不過最近用 debug 模式 run 程式時無意中發現,直接用 + 來串接字串時,其實 Java 會自動用 StringBuilder 來處理,所以上面的狀況我們根本不需要自己多此一舉去用 StringBuilder 來串接,後來查了 API (如下網址)才發現原來文件上也是有寫的
http://download.oracle.com/javase/6/docs/api/java/lang/String.html
節錄如下:
The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method. String conversions are implemented through the method toString, defined byObject and inherited by all classes in Java. For additional information on string concatenation and conversion, see Gosling, Joy, and Steele, The Java Language Specification.

不過也不是說我們就可以完全不用 StringBuilder 了,當 Java 在自動使用 StringBuilder 來處理時,是以一句指令為單位的(目前測試的結果是一個 ; 號結尾算一個指令),所以像這樣

String s = x;
s += y;
s += z;

這樣就會產生了三個 StringBuilder 且 toString() 了三次,完全沒得到好處,反而用了更多的系統資源(多產生了StringBuilder)

又如

String s = "";
for(String x : someStringCollection){
    s += x;
}

這也是一樣,每 loop 一次就會產生一個 StringBuilder 並 toString() 一次

所以不當的寫法確實會消耗很多系統資源

這次又給自己上了一課

4 則留言:

  1. 所以還是做StringBuilder好嗎?

    回覆刪除
  2. 如果是在同一句 statement 中的串接,就不需要自己用 StringBuilder 了,若是多個就要

    回覆刪除
  3. 學了一課,thanks

    回覆刪除

廣告訊息會被我刪除

Related Posts with Thumbnails