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开发团队觉得那些方法是不会有线程安全问题的。
文章说明
本文是本人撰写,其中观点代表个人意见,如果有错误或不同说法,请在文章下留言或联系我:[email protected]