Java字符串拼接效率和String,StringBuilder,StringBuffer三者的區別

Java字符串拼接效率和String,StringBuilder,StringBuffer三者的區別

拼接字符串,用String, StringBuffer,StringBuilder。StringBuilder是jdk1.5中新增的。


測試類如下:

public class TestStringConcat {
    public static void main(String[] args) {
        long n = 30000; 
        System.out.println("Starting... ");  
        //String+=拼接
        long start1 = System.currentTimeMillis();    
        String s1 = new String("hello");    
        for (long i = 0; i < n; i++)    
        {    
            s1+="拼接字符串的時間";    
        }    
        long end1 = System.currentTimeMillis();    
        long time1 = end1 -start1; 
        System.out.println("用String+=拼接字符串的時間"+time1); 

        //String=String+拼接
        long start2 = System.currentTimeMillis();    
        String s2 = new String("hello");    
        for (long i = 0; i < n; i++)    
        {    
            s2=s2+"拼接字符串的時間";    
        }    
        long end2 = System.currentTimeMillis();    
        long time2 = end2 -start2;    
        System.out.println("用String=String+拼接字符串的時間"+time2);  

        //用String.concat拼接
        long start3 = System.currentTimeMillis();    
        String s3 = new String("hello");    
        for (long i = 0; i < n; i++)    
        {    
            s3=s3.concat("拼接字符串的時間");    
        }    
        long end3 = System.currentTimeMillis();    
        long time3 = end3 -start3;    
        System.out.println("用String.concat拼接字符串的時間"+time3);  

        //用StringBuffer.append拼接
        long start4 = System.currentTimeMillis();    
        StringBuffer s4 = new StringBuffer("hello");    
        for (long i = 0; i < n; i++)    
        {    
            s4.append("拼接字符串的時間");    
        }    
        long end4 = System.currentTimeMillis();    
        long time4 = end4 -start4;    
        System.out.println("用StringBuffer.append拼接字符串的時間"+time4);    

        //用StringBuilder.append拼接
        long start5 = System.currentTimeMillis();    
        StringBuilder s5 = new StringBuilder("hello");    
        for (long i = 0; i < n; i++)    
        {    
            s5.append("拼接字符串的時間");    
        }    
        long end5 = System.currentTimeMillis();    
        long time5 = end5 -start5;    
        System.out.println("用StringBuilder.append拼接字符串的時間"+time5);    

        System.out.println("End...");   
    }
}

結果:

Starting...String+=拼接字符串的時間3411String=String+拼接字符串的時間3358String.concat拼接字符串的時間1671
用StringBuffer.append拼接字符串的時間6
用StringBuilder.append拼接字符串的時間2
End...

總結

1.首先說運行速度,或者說是執行速度,在這方面運行速度快慢爲:StringBuilder > StringBuffer > String;
String最慢的原因:
  String爲字符串常量,而StringBuilder和StringBuffer均爲字符串變量,即String對象一旦創建之後該對象是不可更改的,但後兩者的對象是變量,是可以更改的。

2.在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的;
如果一個StringBuffer對象在字符串緩衝區被多個線程使用時,StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證線程是安全的,但StringBuilder的方法則沒有該關鍵字,所以不能保證線程安全,有可能會出現一些錯誤的操作。所以如果要進行的操作是多線程的,那麼就要使用StringBuffer,但是在單線程的情況下,還是建議使用速度比較快的StringBuilder。

3.使用條件:
String:適用於少量的字符串操作的情況。
  StringBuilder:適用於單線程下在字符緩衝區進行大量操作的情況。
  StringBuffer:適用多線程下在字符緩衝區進行大量操作的情況。

文章摘自:https://www.cnblogs.com/su-feng/p/6659064.html
https://www.cnblogs.com/Faith-zhang/p/6374834.html

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