StringBuffer/StringBuilder/String的區別
1、在執行速度上:Stringbuilder->Stringbuffer->String
2、String是字符串常量
Stringbuffer是字符串變量
Stringbuilder是字符串變量
有可能我們會疑惑String怎麽是字符串變量。看以下代碼:
String str = adc;
str = str + “ef”;
System.out.println(str);
輸出結果為:abcef;
在Java虛擬機中str為adc時是一個變量,當str被重新賦值為adcef時為另一個變量,被重新分配了一次內存,上次使用的內存會被gc在適當的時候回收掉。由於這種機制導致了如果有大量的String賦值操作時,會導致運行速度的緩慢,以及內存使用量的上升。
3、一個特殊的例子
String str = “this is only a” + “simple” + “test”;
StringBuffer stringBuffer = new StringBuffer("this is only a").append("simple").append("test");
你會很驚訝的發現,生成str對象速度簡直太快了,而這個時候Stringbuffer居然速度上根本一點都不占優勢。其實這是JVM的一個把戲,實際上:
String str = ”this is only a“ + "simple" + "test";
其實就是
String str = “this is only a simple test”;
所以不需要太多的是時間。但大家這裏需要註意的是,如果你的字符串是來自另外的String對象的話。速度就沒那麽快了,譬如:
String str1 = “this is only a”;
String str2 = "simple";
String str3 = "test";
String str = str1 + str2 + str3;
這時候JVM會規規矩矩的按照原來的方式去做。
4、StringBuilder與StringBuffer
StringBuilder:線程非安全的
StringBuffer:線程安全的
當我們在字符串緩沖區去被多個線程使用時,JVM不能保證StringBuilder的線程是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況是在單線程下進行的,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。
5、對於三者的總結:1)如果操作少量的數據用String
2)單線程下操作大量的數據用StringBuilder
3)多線程下操作大量的數據用StringBuffer
轉載自:http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html
StringBuffer/StringBuilder/String的區別