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则先缓存。

Last modification:July 13th, 2019 at 10:25 am
如果觉得我的文章对你有用,请随意赞赏