前言
StringBuffer类表示一个可变的字符序列。StringBuffer的API与StringBuilder互相兼容,但是StringBuffer是线程安全的。在可能的情况下,建议优先使用StringBuilder,因为在大多数实现中它比StringBuffer更快。
相关知识
源码分析
定义
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
...
}
StringBuffer类被 final 所修饰,因此不能被继承。
StringBuffer类继承于 AbstractStringBuilder类。实际上,AbstractStringBuilder类具体实现了可变字符序列的一系列操作,比如:append()、insert()、delete()、replace()、charAt()方法等。值得一提的是,StringBuilder也是继承于AbstractStringBuilder类。
StringBuffer类实现了2个接口:
- Serializable 序列化接口,表示对象可以被序列化。
- CharSequence 字符序列接口,提供了几个对字符序列进行只读访问的方法,比如:length()、charAt()、subSequence()、toString()方法等。
主要变量
private transient char[] toStringCache;
// AbstractStringBuilder.java
char[] value;
int count;
value、count这两个变量是定义在AbstractStringBuilder类中的。其中:
- toStringCache 用来缓存toString()方法返回的最近一次的value数组中的字符。当修改StringBuffer对象时会被清除。
- value 用来存储字符序列中的字符。value是一个动态的数组,当存储容量不足时,会对它进行扩容。
- count 表示value数组中已存储的字符数。
构造方法
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);
}
// AbstractStringBuilder.java
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
StringBuffer类提供了4个构造方法。构造方法主要完成了对value数组的初始化。其中:
- 默认构造方法设置了value数组的初始容量为16。
- 第2个构造方法设置了value数组的初始容量为指定的大小。
- 第3个构造方法接受一个String对象作为参数,设置了value数组的初始容量为String对象的长度+16,并把String对象中的字符添加到value数组中。
- 第4个构造方法接受一个CharSequence对象作为参数,设置了value数组的初始容量为CharSequence对象的长度+16,并把CharSequence对象中的字符添加到value数组中。
append()方法
@Override
public synchronized StringBuffer append(boolean b) {
toStringCache = null;
super.append(b);
return this;
}
// AbstractS