JDK源碼閱讀之StringBuffer

StringBuffer

      結合【JDK源碼閱讀之StringBuilder】更香。
      和StringBuilder不同,StringBuffer是線程安全的。正如源碼頭一句的介紹所示:A thread-safe, mutable sequence of characters.StringBuffer和String,StringBuilder一樣,都是不可以被繼承的,同時使用字符數組存儲字符。

構造方法

public StringBuffer() {
    super(16);
}
public StringBuffer(int capacity) {
    super(capacity);
}
public StringBuffer(String str) {
    super(str.length() + 16);
    append(str);
}
public StringBuffer(CharSequence seq) {
    this(seq.length() + 16);
    append(seq);
}

      和StringBuilder類中的構造方法一樣,默認的空間爲16。

length()

public synchronized int length() {
    return count;
}

      獲取StringBuffer中字符串的長度。需要注意的是在StringBuffer中這個方法是線程安全的。查看源碼我們會發現所有的方法都是線程安全的。但是,線程安全會帶來效率問題,所有StringBuilder的效率比StringBuffer的效率更高。

capacity()

      獲取StringBuffer的容量,與字符串的長度沒有關係。

StringBuffer buffer = new StringBuffer(20);
buffer.append("hello");
System.out.println(buffer.length());//5
System.out.println(buffer.capacity());//20

toString()

/**
 * A cache of the last value returned by toString. Cleared
 * whenever the StringBuffer is modified.
 */
private transient char[] toStringCache;

public synchronized String toString() {
    if (toStringCache == null) {
        toStringCache = Arrays.copyOfRange(value, 0, count);
    }
    return new String(toStringCache, true);
}

      和StringBuilder直接返回一個字符串不同的是使用了toStringCache構造字符串。toStringCache是一個字符數組,這個變量是用於最近一次toString()方法的緩存,任何時候只要StringBuffer被修改了這個變量會被賦值爲null,相關操作可以在append()、setLength()等方法中發現。所有在toString這個方法中,如果toStringCache爲null則先緩存。

文章同步至【個人站】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章