對StringBuilder和StringBuffer的源碼進行回顧,兩者都是繼承自AbstractStringBuilder,在方法實作上大同小異,個人覺得
對于空字元串的拼接處理上比較有趣,是以着重看了一下。同時StringBuilder和StringBuffer裡面充斥着大量的擴容和數組複制,
并且在對于異常情況的考慮上很值得學習。
StringBuilder
//StringBuilder底層使用char來進行字元存儲
char[] value;
//關于SpringBuilder在拼接空字元串時的操作
public StringBuilder append(String str) {
super.append(str);
return this;
}
//内部處理交由父類AbstractStringBuilder進行處理
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
//拼接完字元串還要進行擴容判斷
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
//處理空字元串
private AbstractStringBuilder appendNull() {
int c = count;
//考慮拼接後的擴容問題
ensureCapacityInternal(c + 4);
final char[] value = this.value;
value[c++] = 'n';
value[c++] = 'u';
value[c++] = 'l';
value[c++] = 'l';
count = c;
return this;
}
//擴容操作
private void ensureCapacityInternal(int minimumCapacity) {
if (minimumCapacity - value.length > 0) {
//發生擴容意味着對原數組進行複制,效率低
value = Arrays.copyOf(value, newCapacity(minimumCapacity));
}
}
StringBuffer和StringBuilder的差別
共同點
1.SpringBuffer和StringBuilder都繼承自AbstractStringBuilder,支援序列化操作;
2.在進行對象拼接時,都是将對象轉成String類型進行操作;在操作空字元串時,會進行“null”字元串的拼接;
不同點
1.StringBuffer線程安全,因為StringBuffer使用的是Synchnroized修飾;StringBuilder線程不安全;
2、同時,線程安全意味着效率較低,線程不安全效率相對高。