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