一、在執行速度上:Stringbuilder->Stringbuffer->Stringhtml
二、String是字符串常量安全
Stringbuffer是字符串變量多線程
Stringbuilder是字符串變量app
有可能咱們會疑惑String怎麼是字符串變量。看如下代碼:ui
String str = adc;this
str = str + 「ef」;spa
System.out.println(str);線程
輸出結果爲:abcef;htm
在Java虛擬機中str爲adc時是一個變量,當str被從新賦值爲adcef時爲另外一個變量,被從新分配了一次內存,上次使用的內存會被gc在適當的時候回收掉。因爲這種機制致使了若是有大量的String賦值操做時,會致使運行速度的緩慢,以及內存使用量的上升。對象
String的值是不可變的,這就致使每次對String的操做都會生成新的String對象,這樣不只效率低下,並且大量浪費有限的內存空間。
咱們來看一下這張對String操做時內存變化的圖:
咱們能夠看到,初始String值爲「hello」,而後在這個字符串後面加上新的字符串「world」,這個過程是須要從新在棧堆內存中開闢內存空間的,最終獲得了「hello world」字符串也相應的須要開闢內存空間,這樣短短的兩個字符串,卻須要開闢三次內存空間,不得不說這是對內存空間的極大浪費。爲了應對常常性的字符串相關的操做,谷歌引入了兩個新的類——StringBuffer類和StringBuild類來對此種變化字符串進行處理。
當對字符串進行修改的時候,須要使用 StringBuffer 和 StringBuilder 類。
和 String 類不一樣的是,StringBuffer 和 StringBuilder 類的對象可以被屢次的修改,而且不產生新的未使用對象。
StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不一樣在於 StringBuilder 的方法不是線程安全的(不能同步訪問)。
因爲 StringBuilder 相較於 StringBuffer 有速度優點,因此多數狀況下建議使用 StringBuilder 類。然而在應用程序要求線程安全的狀況下,則必須使用 StringBuffer 類。
初始化上的區別,String能夠空賦值,後者不行,報錯
①String
StringBuffer s = null;
StringBuffer s = 「abc」;
②StringBuffer
StringBuffer s = null; //結果警告:Null pointer access: The variable result can only be null at this location
StringBuffer s = new StringBuffer();//StringBuffer對象是一個空的對象
StringBuffer s = new StringBuffer(「abc」);//建立帶有內容的StringBuffer對象,對象的內容就是字符串」
三、一個特殊的例子
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會規規矩矩的按照原來的方式去作。
四、StringBuilder與StringBuffer
StringBuilder:線程非安全的
StringBuffer:線程安全的
當咱們在字符串緩衝區去被多個線程使用時,JVM不能保證StringBuilder的線程是安全的,雖然他的速度最快,可是能夠保證StringBuffer是能夠正確操做的。固然大多數狀況是在單線程下進行的,因此大多數狀況下是建議用StringBuilder而不用StringBuffer的,就是速度的緣由。
一、StringBuffer 與 StringBuilder 中的方法和功能徹底是等價的
二、只是StringBuffer 中的方法大都採用了 synchronized 關鍵字進行修飾,所以是線程安全的,而 StringBuilder 沒有這個修飾,能夠被認爲是線程不安全的。
三、在單線程程序下,StringBuilder效率更快,由於它不須要加鎖,不具有多線程安全而StringBuffer則每次都須要判斷鎖,效率相對更低。
五、對於三者的總結:1)若是操做少許的數據用String
2)單線程下操做大量的數據用StringBuilder
3)多線程下操做大量的數據用StringBuffer
轉載自:http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html