JDK源码阅读之StringBuffer和StringBuilder

StringBuffer的用途

线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

StringBuilder的用途

一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

StringBuffer和StringBuilder的类图

在这里插入图片描述
从类图中可以看到,StringBuilder和StringBuffer都是继承于同一个类AbstractStringBuilder,在源码中,这两个类的大部分方法都是调用父类的同名方法来实现的。

重点方法解析

大部分方法详情请阅读: jdk源码阅读之AbstractStringBuilder.

StringBuilder

StringBuilder的大部分方法都是直接调用父类的同名方法。所以大部分方法在上一篇的博文中已经体现了。

构造方法

public StringBuilder() {
        super(16);
    }

没有确定容量的构造方法,StringBuilder会给一个默认的容量大小的方法。容量为16。

增加的方法

 /**
     * Save the state of the <tt>StringBuilder</tt> instance to a stream
     * (that is, serialize it).
     *
     * @serialData the number of characters currently stored in the string
     *             builder (<tt>int</tt>), followed by the characters in the
     *             string builder (<tt>char[]</tt>).   The length of the
     *             <tt>char</tt> array may be greater than the number of
     *             characters currently stored in the string builder, in which
     *             case extra characters are ignored.
     */
    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
        s.defaultWriteObject();
        s.writeInt(count);
        s.writeObject(value);
    }

    /**
     * readObject is called to restore the state of the StringBuffer from
     * a stream.
     */
    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        s.defaultReadObject();
        count = s.readInt();
        value = (char[]) s.readObject();
    }

这两个方法有点奇怪,权限是private,但是内部没有调用这两个方法,感觉这两个方法没有排上用场。

StringBuffer

StringBuffer和StringBuilder一样的,初始默认容量也是16,但是StringBuffer是线程同步的。

为什么StringBuffer是线程同步的?

因为StringBuffer的很多方法有同步(synchronized)的标识。所以StringBuffer是线程同步的。

阅读后的感想

这两个类都是调用父类的方法的,他们之间的区别体现在方法同步(synchronized)的标识上,这个是本质的区别。如果有人问“为什么StringBuilder的效率会高于StringBuffer?”这个问题在阅读源码之后变得直接而简单了,因为有方法同步(synchronized)的标识会有额外的开销,导致StringBuffer的性能比不上StringBuilder。但是要注意的一点是:StringBuffer的大部分方法有方法同步(synchronized)的标识,但是也有一些是没有的。可能jdk开发团队觉得那些方法是不会有线程安全问题的。

文章说明

本文是本人撰写,其中观点代表个人意见,如果有错误或不同说法,请在文章下留言或联系我:zlh8013gsf@126.com

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页