StringBuffer/StringBuilder/String的區別

一、在執行速度上: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

相關文章
相關標籤/搜索