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