天天看點

java中String,StringBuffer與StringBuilder的差別??

本文着重介紹下,應該在何時恰當的使用string,stringbuffer,stringbuilder。

1,執行速度

StringBuilder >  StringBuffer  >  String

我們知道String是字元串常量,不可變對象,是以每次對String進行操作的時候實際上是生成了一個新的String對象,然後将指針指向新的String對象上,之前的String對象就沒有了指針引用,當記憶體中無引用的對象多了之後,就會觸發JVM的GC操作了。

StringBuilder和StringBuffer是字元串變量,是以當我們對字元串做操作的時候,實際上都是操作的同一個對象,不會建立新的對象。

注意:

String str="hel"+"lo";

String a = "hel";
String b ="lo";
String c = a+b;      

上面的兩部分代碼雖然輸出的結果都是“hello”,但是在jvm中的記憶體分布是完全不同的。

String str="hel"+"lo"; 中的str是一個編譯時常量,最後配置設定到記憶體裡面的隻有"hello" 這一款記憶體區域。
而下面的三行代碼,則需要在記憶體中配置設定三塊位址,【"hel","lo","hello"】。

      

由此可以得出執行順序了,但是StringBuilder為什麼會比StringBuffer快呢,請繼續往下看

2,線程安全

StringBuilder是線程不安全的,而StringBuffer是線程安全的

StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的資料。每個方法都能有效地将給定的資料轉換成字元串,然後将該字元串的字元追加或插入到字元串緩沖區中。append 方法始終将這些字元添加到緩沖區的末端;而 insert 方法則在指定的點添加字元。

例如,如果 z 引用一個目前内容是“start”的字元串緩沖區對象,則此方法調用 z.append("le") 會使字元串緩沖區包含“startle”,而 z.insert(4, "le") 将更改字元串緩沖區,使之包含“starlet”。

java.lang.StringBuilder一個可變的字元序列是5.0新增的。此類提供一個與 StringBuffer 相容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字元串緩沖區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先采用該類,因為在大多數實作中,它比 StringBuffer 要快。兩者的方法基本相同。

如果一個StringBuffer對象在字元串緩沖區被多個線程使用時,StringBuffer中很多方法可以帶有synchronized關鍵字,是以可以保證線程是安全的,但StringBuilder的方法則沒有該關鍵字,是以不能保證線程安全,有可能會出現一些錯誤的操作。是以如果要進行的操作是多線程的,那麼就要使用StringBuffer,但是在單線程的情況下,還是建議使用速度比較快的StringBuilder。

3,總結

  String:适用于少量的字元串操作的情況

  StringBuilder:适用于單線程下在字元緩沖區進行大量操作的情況

  StringBuffer:适用多線程下在字元緩沖區進行大量操作的情況

開開心心編碼,快快樂樂生活。