轉貼來自:http://anonymous.bokee.com/875294.html
字串的串連操作符(+,string concatenations operator);如果是產生一行輸出,或者是產生小的,大小固定的對象用+是很合適的,但是對於大規模的情形;因為為了串連n個字串而重複使用字串串連符,要求n的平方級時間。(字串是不可變的,兩個字串被串連的時候,他們的內容都要被拷貝)
這裡有個例子能說明這點:......
+-------CODE------------+
public class StringEffective
{
public static void main(String args[])
{
String s="abc";
StringBuffer sb=new StringBuffer(100);
int circle=100000;
long t1=System.currentTimeMillis();
for(int i=0;i<circle;i++)
{
s+="a";
}
long t2=System.currentTimeMillis();
System.out.println("[String] Time: <"+(t2-t1)+">");
t1=System.currentTimeMillis();
for(int i=0;i<circle;i++)
{
sb.append("a");
}
t2=System.currentTimeMillis();
System.out.println("[StringBuffer] Time: <"+(t2-t1)+">" );
}
}
/**
*circle=100
*result:
*[String] Time: <0>
*[StringBuffer] Time: <0>
*+---------------------------+
*circle=1000
*result:
*[String] Time: <15>
*[StringBuffer] Time: <0>
*+---------------------------+
*circle=10000;
*result;
*[String] Time: <954>
*[StringBuffer] Time: <0>
*+---------------------------+
*circle=100000
*result:
*[String] Time: <526828>
*[StringBuffer] Time: <15>
*/
+------------END---------------------+
第一種方法所使用的時間是指數式增長,而第二種是,使他線性增長,所以,項目足夠大的話,效能的差別就更顯著。需要注意的是,第二種做法事先分配了一個StringBuffer,使他足夠大以便能夠容納結果字串。不過即使不知道結果字串的大小,使用一個預設的大小的StringBuffer,他仍然比第一種做法快45倍。
所以總結一些,用Joshua Bloch的話說:不要使用字串串連操作符來合并多個字串,除非效能無關緊要。相反,應該使用StringBuffer的append方法,或者採用其他的方案,比如使用字元數組,或者每次只處理一個字串,而不是把他們組合起來。