具體看以下的例子講解:
String str = "" ; for(int i=0 ; i<10000 ; i++) str+="java";
相信大家都知道String這個類別是屬於Immutable Object,不知道的可以到Java String和String Pool查看。以這段code來說用迴圈進行大量的串接字串的工作,在效能上會有隱憂。所以Java提供了其他的方法提高效能。
我們為這三個方式做一個小測試。
public class Test { public static void main(String args[]) { testString(); testStringBuffer(); testStringBuilder(); } public static void testString() { String str = "" ; long begin = System.currentTimeMillis(); for(int i=0 ; i<10000 ; i++) str+="java"; long end = System.currentTimeMillis(); System.out.println("String Spend Time:"+(end-begin)+"ms"); } public static void testStringBuffer() { StringBuffer sbuf = new StringBuffer(); long begin = System.currentTimeMillis(); for(int i=0 ; i<10000 ; i++) sbuf.append(i); long end = System.currentTimeMillis(); System.out.println("String Buffer Time:"+(end-begin)+"ms"); } public static void testStringBuilder() { StringBuilder sb = new StringBuilder(); long begin = System.currentTimeMillis(); for(int i=0 ; i<10000 ; i++) sb.append("java"); long end = System.currentTimeMillis(); System.out.println("String Builder Spend Time:"+(end-begin)+"ms"); } }
執行結果:
從上面的結果可以看到同樣的工作StringBuilder和StringBuffer的處理時間是差不多,但String的處理時間相對於其他兩種方式慢了很多。
在一般情況執行效率StringBuilder>StringBuffer>String,不一定所有情況都是這樣。
String: 適合在少量的字符串操作的情況。
StringBuilder:適合在單線程下進行大量操作的情況
StringBuffer:適合在多線程進行大量操作的情況
在compile的時候可以確定字串的常量,那沒必要使用StringBuilder或StringBuffer,直接使用String常量"+"進行連接效率最好。