头像

带翅膀的猫

时光荏苒,我们一直都在

《JDK源码之StringBuffer》

 1月前  •   JDK源码阅读  •     •   15  •   0

StringBuffer

和StringBuilder不同,StringBuffer是线程安全的。正如源码头一句的介绍所示:A thread-safe, mutable sequence of characters.StringBuffer和String,StringBuilder一样,都是不可以被继承的,同时使用字符数组存储字符。

构造方法

JAVApublic 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()

JAVApublic 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()

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

上一篇:
下一篇:

 评论


 已有0条评论

    还没有任何评论,你来说两句吧!