天天看點

StringBuilder&StringBuffer

對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、同時,線程安全意味着效率較低,線程不安全效率相對高。