1:三者在執行速度方面的比較:StringBuilder > StringBuffer > String
2:String <(StringBuffer,StringBuilder)的原因
String:字符串常量
StringBuffer:字符串變量
StringBuilder:字符串變量
從上面的名字可以看到,String是“字符串常量”,也就是不可改變的對象。對於這句話的理解你可能會產生這樣一個疑問 ,比如這段代碼:
String s = "abcd";
s = s+1;
System.out.print(s);
我們明明就是改變了String型的變量s的,爲什麼說是沒有改變呢? 其實這是一種欺騙,JVM是這樣解析這段代碼的:首先創建對象s,賦予一個abcd,然後再創建一個新的對象s用來執行第二行代碼,也就是說我們之前對象s並沒有變化,所以我們說String類型是不可改變的對象了,由於這種機制,每當用String操作字符串時,實際上是在不斷的創建新的對象,而原來的對象就會變爲垃圾被GC(垃圾回收器)回收掉,可想而知這樣執行效率會有多低。
而StringBuffer與StringBuilder就不一樣了,他們是字符串變量,是可改變的對象,每當我們用它們對字符串做操作時,實際上是在一個對象上操作的,這樣就不會像String一樣創建一些而外的對象進行操作了,當然速度就快了。
StringBuffer是線程安全的可變字符序列。一個類似於
String
的字符串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。
StringBuilder一個可變的字符序列。此類提供一個與 StringBuffer
兼容的 API,但不保證同步。該類被設計用作StringBuffer
的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因爲在大多數實現中,它比StringBuffer
要快。
Java 語言提供對字符串串聯符號("+")以及將其他對象轉換爲字符串的特殊支持。字符串串聯是通過StringBuilder
(或StringBuffer
)類及其append
方法實現的。