1. 程式人生 > 實用技巧 >String StringBuffer 和 StringBuilder 的區別是什麼?

String StringBuffer 和 StringBuilder 的區別是什麼?

String StringBuffer 和 StringBuilder 的區別是什麼?

記錄一下面試提到的問題。

為什麼 String 是不可變

  因為 String 類中使用 final 關鍵字修飾字符陣列來儲存字串, peivate final char value[], 所以 String 物件是不可變的。

補充; 在 Java 9 之後,String 類的實現改用 byte 陣列儲存字串 private final byte[] value 。 具體可以自行了解。

  而 StringBufferStringBuilder 都繼承自 AbstractStringBuilder

類,在 AbstractStringBuilder 中也是使用字元陣列儲存字串 char[]value 但是沒有用 final 關鍵字修飾,所以這兩種物件都是可變的。

StringBuilderStringBuffer 的構造方法都是呼叫父類構造方法也就是AbstractStringBuilder 實現的,大家可以自行查閱原始碼。

執行緒安全性

  String 中的物件是不可變的,也就可以理解為常量,執行緒安全
  AbstractStringBuilderStringBuilderStringBuffer 的公共父類,定義了一些字串的基本操作,如 expandCapacity

appendinsertindexOf 等公共方法。StringBuffer 對方法加了同步鎖或者對呼叫的方法加了同步鎖,所以是執行緒安全的StringBuilder 並沒有對方法進行加同步鎖,所以是非執行緒安全的。

效能

  每次對 String 型別進行改變的時候,都會生成一個新的 String 物件,然後將指標指向新的 String 物件。StringBuffer 每次都會StringBuffer 物件本身進行操作,而不是生成新的物件並改變物件引用。相同情況下使用 StringBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的效能提升,但卻要冒多執行緒不安全的風險。

總結

  1. 操作少量的資料: 適用 String
  2. 單執行緒操作字串緩衝區下操作大量資料: 適用 StringBuilder
  3. 多執行緒操作字串緩衝區下操作大量資料: 適用 StringBuffer
String StringBuffer StringBuilder
不可變 可變 可變
執行緒安全 執行緒安全 非執行緒安全
操作少量的資料 多執行緒操作字串緩衝區下操作大量資料 單執行緒操作字串緩衝區下操作大量資料

來源:

  JavaGuide-Java基礎