String,StringBuffer,StringBuilder,StringWriter的效率差

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=100000

String+=: 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的效率會高吧。。。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章