String最慢其次StringBuffer,最快StringBuilder,而且字符串的操作也影響着效率。
沒有數據顯得沒有說服力,做了一下實驗。
import java.io.StringWriter;
public class LearnTest {
<span style="white-space:pre"> </span>public static void main(String[] args) {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub\
<span style="white-space:pre"> </span>String str="";
<span style="white-space:pre"> </span>StringBuffer strbf=new StringBuffer("");
<span style="white-space:pre"> </span>StringBuilder strbd=new StringBuilder("");
<span style="white-space:pre"> </span>StringWriter strwr=new StringWriter();
<span style="white-space:pre"> </span>double begin,end;
<span style="white-space:pre"> </span>begin=System.currentTimeMillis();
<span style="white-space:pre"> </span>for(int i=0;i<100000;i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>str+="1000";
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>end=System.currentTimeMillis();
<span style="white-space:pre"> </span>System.out.println("String+=: "+(end-begin));
<span style="white-space:pre"> </span>str="";
<span style="white-space:pre"> </span>begin=System.currentTimeMillis();
<span style="white-space:pre"> </span>for(int i=0;i<100000;i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>str=str+"1000";
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>end=System.currentTimeMillis();
<span style="white-space:pre"> </span>System.out.println("String=+: "+(end-begin));
<span style="white-space:pre"> </span>begin=System.currentTimeMillis();
<span style="white-space:pre"> </span>for(int i=0;i<100000;i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>strbf.append("1000");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>end=System.currentTimeMillis();
<span style="white-space:pre"> </span>System.out.println("StringBuffer: "+(end-begin));
<span style="white-space:pre"> </span>begin=System.currentTimeMillis();
<span style="white-space:pre"> </span>for(int i=0;i<100000;i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>strbd.append("1000");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>end=System.currentTimeMillis();
<span style="white-space:pre"> </span>System.out.println("StringBuilder: "+(end-begin));
<span style="white-space:pre"> </span>begin=System.currentTimeMillis();
<span style="white-space:pre"> </span>for(int i=0;i<100000;i++){
<span style="white-space:pre"> </span>strwr.append("1000");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>end=System.currentTimeMillis();
<span style="white-space:pre"> </span>System.out.println("StringWriter:"+(end-begin));<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
}
測試結果
n=1000
String+=: 11.0
String=+: 3.0
StringBuffer: 0.0
StringBuilder: 0.0
StringWriter: 0.0
n=10000
String+=: 250.0
String=+: 191.0
StringBuffer: 1.0
StringBuilder: 0.0
StringWriter: 3.0
n=100000String+=: 19375.0
String=+: 20145.0
StringBuffer: 5.0
StringBuilder: 1.0
StringWriter: 7.0
可以發現遞增非線性,可能跟函數狀態的保存有關係
去掉String比較一下後兩者
n=1000000:
StringBuffer: 40.0
StringBuilder: 22.0
StringWriter: 42.0
n=10000000:
StringBuffer: 413.0
StringBuilder: 418.0
StringWriter: 379.0
n=100000000
我分配的空間就不足了,也許Buffer的效率會高吧。。。