1. 程式人生 > 其它 >JDK原始碼筆記05 StringBuffer、StringBuilder

JDK原始碼筆記05 StringBuffer、StringBuilder

sth before start

接下來會看StringBuffer、StringBuilder、StringJoiner。其實我感覺這幾個類的實現原理應該是不難的,字串拼接無非就是字元陣列的操作,然後呼叫String的建構函式返回嘛。不過我印象裡這些類的效率還是有差別的,有點好奇具體有什麼差別。

StringBuffer說明

  1. 執行緒安全,方法都是同步的(synchronized)
  2. 可變的字元陣列段(sequence of characters)
  3. 他的操作雖然是執行緒安全的,但是如果傳入的原資料(source sequence)是多個執行緒共享的,那麼為了保證執行緒安全,執行方法的時候也需要獲得鎖來保證執行緒安全
  4. 自動擴容
  5. 除法特殊說明,傳入空指標會丟擲空指標異常
  6. StringBuilder更快,因為他不需要同步
  7. 實現了Comparable,但是沒有重寫equals,要是用StringBuffer作為SortedMap的key時要注意

屬性

private transient String toStringCache;
//快取toString的返回值
//transient表示序列化的時候不會被序列化
//呼叫insert或其他會改變字串的方法的時候會設定成空

方法

然後其實方法裡都是呼叫了父類AbstractStringBuilder的方法,append之類的方法其實都是在這個類裡實現的。StringBuffer和StringBuilder只是一個包裝類。

建構函式

  1. public StringBuffer() {super(16);}
    建立容量為16的StringBuffer
  2. public StringBuffer(int capacity)
  3. public StringBuffer(String str)
    根據str的屬性建立新的byte[],然後呼叫append進行初始化

append(str)

  1. 檢視編碼,看看需不需要從Latin1改成UTF16
  2. 看看容量夠不夠,不夠就擴容
  3. 呼叫String的getBytes,將str的內容拷貝進現在的value裡

其他方法也都是大同小異的字串操作

比較函式

  • 0 :相同
  • 正數:呼叫方字典序前
  • 負數:呼叫方字典序後

關於同步

其實就是在所有的方法頭都用上了synchronized。。。。。。
我繃不住了