1. 程式人生 > >String、StringBuffer與StringBuilder三者的區別

String、StringBuffer與StringBuilder三者的區別

不可變 abcd ges 區別 ++ 源碼 重新 strong blog

簡單的說:

String:創建的是字符串常量,創建的字符串會放入內存的常量池中,是不可變的對象。如果要對String類型的內容進行改變,實際上每次改變都會重新new一個String類型的字符串對象,指針指向的地址已經發生改變。如果要經常改變字符串的內容時,不建議使用String類型的字符串,因為每次創建新的字符串對象都會對系統造成影響。

StringBuffer:創建字符串,當要改變內容時是對其本身進行修改,並不會創建新的對象。該方法線程安全。

StringBuilder:創建字符串,當要改變內容時是對其本身進行修改,並不會創建新的對象。該方法線程不安全。

深入談論:

我們以StringBuffer為例

當我們創建一個StringBuffer對象時,

StringBuffer sb = new StringBuffer();實際上是創建了一個初始長度為16的字符數組。如下圖

技術分享

技術分享

我們也可以這樣創建

StringBuffer sb = new StringBuffer("abcd"),我們這時得到的初始長度為str.length()+16,字符數組為:{‘a‘,‘b‘,‘c‘,‘d‘,\u0000,\u0000.......}

技術分享

整個字符串創建修改的過程為:

1 public static void main(String[] args){
2         StringBuffer sb = new StringBuffer();
3 sb.append("You ").append("are ").append("my ").append("world"); 4 System.out.println(sb); 5 }

這裏我們發散一下,我們append添加新的字符串後的長度超過了初始長度我們接下來怎麽去做?

源碼提供了一種方法:在老數組上創建一個新的數組,新數組長度為value.length*2+2

技術分享

public static void main(String[] args){
        StringBuffer sb = new StringBuffer();
        
for (int i=0;i<1000;i++){ sb.append(i); } System.out.println(sb); }

  Java.lang.StringBuffer線程安全的可變字符序列。一個類似於 String 的字符串緩沖區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。
  可將字符串緩沖區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。
  StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然後將該字符串的字符追加或插入到字符串緩沖區中。append 方法始終將這些字符添加到緩沖區的末端;而 insert 方法則在指定的點添加字符。

  StirngBuffer與StringBuilder方法基本一致。用在字符串緩沖區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先采用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。

String、StringBuffer與StringBuilder三者的區別