String、StringBuffer與StringBuilder之間區別

String、StringBuffer與StringBuilder之間區別

三個類在字符串處理中的位置不言而喻。但各自有各自的優缺點,需做到善於合理運用

String 
1,Stirng是對象不是基本數據類型 
2,String是final類,不能被繼承。是不可變對象,一旦創建,就不能修改它的值。 
3,對於已經存在的Stirng對象,修改它的值,就是重新創建一個對象,然後將新值賦予這個對象 
StringBuffer 
1,一個類似於 String 的字符串緩衝區,對它的修改的不會像String那樣重創建對象。 
2,使用append()方法修改Stringbuffer的值,使用toString()方法轉換爲字符串。 
Stringbuilder
是jdk1.5後用來替換stringBuffer的一個類,大多數時候可以替換StringBuffer。和StringBuffer的區別在於Stringbuild是一個單線程使用的類,不值執行線程同步所以比StringBuffer的速度快,效率高。

   StringBuilder:線程非安全的

   StringBuffer:線程安全的

    當我們在字符串緩衝區被多個線程使用時,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。



1.三者在執行速度方面的比較:StringBuilder >  StringBuffer  >  String

原因:String是字符串常量,StringBuffer與StringBuilder是字符串變量

問題:理解String是字符串常量

1 String s = "abcd";
2 = s+1;
3 System.out.print(s);// result : abcd1

        解釋: 我們明明就是改變了String型的變量s的,爲什麼說是沒有改變呢? 其實這是一種欺騙,這個操作其實是創建了2個String對象。JVM是這樣解析這段代碼的:首先創建對象s,賦予一個abcd,然後再創建一個新的對象s用來執行第二行代碼,也就是說我們之前對象s並沒有變化,所以我們說String類型是不可改變的對象了,由於這種機制,每當用String操作字符串時,實際上是在不斷的創建新的對象,而原來的對象就會變爲垃圾被GC回收掉,可想而知這樣執行效率會有多底。

1String s2 = "hello" 
2 s2 += "world"; 
這操作是:先創建一個String對象,在接下來進行字符串連接的時候,有創建了一個StringBuild(jdk1.5前是StringBuffer),然後調用append()方法,最後調用toString()方法。 


由此可以看出String對字符的操作比直接使用Stringbuffer(或者StringBuild)要多出附加的操作,而且String是不可變對象,使用String對字符串操作會產生大量的、多餘java對象。所以結果是:影響性能,佔用空間。 
程序舉例: 
分別使用String和StringBuffer對字符串“0123456789”累加10000次,然後統計耗時多長 

        String str = "0123456789"; 
        String str2 = ""; 
        int count = 10000; 
        long start = System.currentTimeMillis(); 
        for (int i = 0; i < count; i++) { 
            str2 += str; 
        } 
        long end = System.currentTimeMillis(); 
        long time = (end - start); 
        System.out.println(time); 
運行多次,在我的機器上平均時間約等於3300,即3.3秒,下面用StringBuffer來操作,查看結果 
String str = "0123456789"; 
StringBuffer sb = new StringBuffer(); 
int count = 10000; 
long start = System.currentTimeMillis(); 
for (int i = 0; i < count; i++) { 
sb.append(str); 

String str2 = sb.toString(); 
long end = System.currentTimeMillis(); 
long time = (end - start); 
System.out.println(time); 
同樣在我的機器上結果平均結果小於10,即0.01秒,兩者相差300多倍,而且隨着循環次數的增加這個差距逐漸增大 



對於三者使用的總結: 1.如果要操作少量的數據用 = String

           2.多線程操作字符串緩衝區 下操作大量數據 = StringBuffer

           3.單線程操作字符串緩衝區 下操作大量數據 = StringBuilder



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