天天看點

String / StringBuffer / StringBuilder的差別

String 字元串常量

StringBuffer 字元串變量(線程安全)

StringBuilder 字元串變量(非線程安全)

主要差別如下:

1. String是不可變的,而StringBuffer和StringBuilder是可變的

可以在源碼中看到,String類是被定義為final的,而StringBuffer和StringBulider不是 舉個例子 String a="asd";//假設a指向了0x00001的位址 假如再 a="saf";//假設saf的位址是0x00002 此時,a是指向0x00002位址,而不是0x00001位址 a="saf"相當于新産生了一個String對象,而0x00001的“asd”對象還存在 而如果是用 StringBuilder或者StringBuffer進行上述操作,a還是指向0x00001位址,隻是将其上的内容改了,并沒有産生新的對象

2. String和StringBuffer是線程安全的,而StringBuilder是非線程安全的

String因為是定義為final的,是以是線程安全的,而StringBuffer加了同步鎖,是以也是線程安全的。

3. String是java.lang.String而StringBuffer和StringBuilder都是繼承自AbstractStringBuilder(是一個抽象類)

是以StringBuffer和StringBulider擁有共同的方法,比如append

執行速度

這三個類在進行操作時的速度關系為:StringBuilder > StringBuffer > String

由于String中進行操作時都會建立一個char[ ]數組代替原來的char[ ]數組,是以速度最慢

StringBuffer線程安全,每個方法都有synchronized同步阻塞,是以操作速度受影響

StringBuilder沒有同步阻塞的限制,是以操作速度最快

使用場景

  • 如果要操作少量的資料用 = String
  • 單線程操作字元串緩沖區 下操作大量資料 = StringBuilder
  • 多線程操作字元串緩沖區 下操作大量資料 = StringBuffer

在大部分情況下 StringBuffer > String

StringBuffer

    Java.lang.StringBuffer線程安全的可變字元序列。一個類似于 String 的字元串緩沖區,但不能修改。雖然在任意時間點上它都包含某種特定的字元序列,但通過某些方法調用可以改變該序列的長度和内容。

    可将字元串緩沖區安全地用于多個線程。可以在必要時對這些方法進行同步,是以任意特定執行個體上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一緻。

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

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

在大部分情況下 StringBuilder > StringBuffer java.lang.StringBuilder

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

常用方法

String都比較熟悉,這裡隻整理StirngBuffer/StringBuilder類的方法,這兩個類大多數方法都是繼承于AbstractStringBuilder父類

1、append(String str) 追加内容到目前StirngBuffer/StringBuilder對象的末尾,類似于字元串的連接配接

2、deleteCharAt(int k)删除指定位置的字元,然後将剩餘的内容形成新的字元串

3、delete(int start, int end) 删除指定區間以内的所有字元,包含start,不包含end索引的區間

4、insert(int index, String str) 在StirngBuffer/StringBuilder對象指定位置中插入内容str,然後形成新的字元串

5、reverse() 将StirngBuffer/StringBuilde對象中的内容反轉,然後形成新的字元串

參考連結:

https://blog.csdn.net/ls5718/article/details/51899027

https://blog.csdn.net/martinmateng/article/details/50808052

https://blog.csdn.net/m0_37241851/article/details/71056290