JDK原始碼筆記05 StringBuffer、StringBuilder
阿新 • • 發佈:2021-07-03
sth before start
接下來會看StringBuffer、StringBuilder、StringJoiner。其實我感覺這幾個類的實現原理應該是不難的,字串拼接無非就是字元陣列的操作,然後呼叫String的建構函式返回嘛。不過我印象裡這些類的效率還是有差別的,有點好奇具體有什麼差別。
StringBuffer說明
- 執行緒安全,方法都是同步的(synchronized)
- 可變的字元陣列段(sequence of characters)
- 他的操作雖然是執行緒安全的,但是如果傳入的原資料(source sequence)是多個執行緒共享的,那麼為了保證執行緒安全,執行方法的時候也需要獲得鎖來保證執行緒安全
- 自動擴容
- 除法特殊說明,傳入空指標會丟擲空指標異常
- StringBuilder更快,因為他不需要同步
- 實現了Comparable,但是沒有重寫equals,要是用StringBuffer作為SortedMap的key時要注意
屬性
private transient String toStringCache;
//快取toString的返回值
//transient表示序列化的時候不會被序列化
//呼叫insert或其他會改變字串的方法的時候會設定成空
方法
然後其實方法裡都是呼叫了父類AbstractStringBuilder
的方法,append之類的方法其實都是在這個類裡實現的。StringBuffer和StringBuilder只是一個包裝類。
建構函式
- public StringBuffer() {super(16);}
建立容量為16的StringBuffer - public StringBuffer(int capacity)
- public StringBuffer(String str)
根據str的屬性建立新的byte[],然後呼叫append進行初始化
append(str)
- 檢視編碼,看看需不需要從Latin1改成UTF16
- 看看容量夠不夠,不夠就擴容
- 呼叫String的getBytes,將str的內容拷貝進現在的value裡
其他方法也都是大同小異的字串操作
比較函式
- 0 :相同
- 正數:呼叫方字典序前
- 負數:呼叫方字典序後
關於同步
其實就是在所有的方法頭都用上了synchronized。。。。。。
我繃不住了