1. 程式人生 > >StringBuffer/StringBuilder/String的區別

StringBuffer/StringBuilder/String的區別

com cnblogs 輸出結果 就是 內存 sim adc 虛擬機 arch

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的區別