StringBuilder 源码分析
StringBuilder
类是 Java 中提供的一个用于创建可变字符串的类。与 StringBuffer
类不同,StringBuilder
不是线程安全的,但性能比 StringBuffer
更高。以下是对 StringBuilder
类的源码进行详细分析。
1. 基本结构
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
static final long serialVersionUID = 4383685877147921099L;
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);
}
@Override
public StringBuilder append(Object obj) {
super.append(String.valueOf(obj));
return this;
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
@Override
public StringBuilder append(StringBuffer sb) {
super.append(sb);
return this;
}
@Override
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
}
@Override
public StringBuilder append(CharSequence s, int start, int end) {
super.append(s, start, end);
return this;
}
@Override
public StringBuilder append(char[] str) {
super.append(str);
return this;
}
@Override
public StringBuilder append(char[] str, int offset, int len) {
super.append(str, offset, len);
return this;
}
@Override
public StringBuilder append(boolean b) {
super.append(b);
return this;
}
@Override
public StringBuilder append(char c) {
super.append(c);
return this;
}
@Override
public StringBuilder append(int i) {
super.append(i);
return this;
}
@Override
public StringBuilder append(long lng) {
super.append(lng);
return this;
}
@Override
public StringBuilder append(float f) {
super.append(f);
return this;
}
@Override
public StringBuilder append(double d) {
super.append(d);
return this;
}
@Override
public StringBuilder delete(int start, int end) {
super.delete(start, end);
return this;
}
@Override
public StringBuilder deleteCharAt(int index) {
super.deleteCharAt(index);
return this;
}
@Override
public StringBuilder replace(int start, int end, String str) {
super.replace(start, end, str);
return this;
}
@Override
public StringBuilder insert(int index, char[] str, int offset, int len) {
super.insert(index, str, offset, len);
return this;
}
@Override
public StringBuilder insert(int offset, Object obj) {
super.insert(offset, String.valueOf(obj));
return this;
}
@Override
public StringBuilder insert(int offset, String str) {
super.insert(offset, str);
return this;
}
@Override
public StringBuilder insert(int offset, char[] str) {
super.insert(offset, str);
return this;
}
@Override
public StringBuilder insert(int dstOffset, CharSequence s) {
super.insert(dstOffset, s);
return this;
}
@Override
public StringBuilder insert(int dstOffset, CharSequence s, int start, int end) {
super.insert(dstOffset, s, start, end);
return this;
}
@Override
public StringBuilder insert(int offset, boolean b) {
super.insert(offset, b);
return this;
}
@Override
public StringBuilder insert(int offset, char c) {
super.insert(offset, c);
return this;
}
@Override
public StringBuilder insert(int offset, int i) {
super.insert(offset, i);
return this;
}
@Override
public StringBuilder insert(int offset, long l) {
super.insert(offset, l);
return this;
}
@Override
public StringBuilder insert(int offset, float f) {
super.insert(offset, f);
return this;
}
@Override
public StringBuilder insert(int offset, double d) {
super.insert(offset, d);
return this;
}
@Override
public int indexOf(String str) {
return super.indexOf(str);
}
@Override
public int indexOf(String str, int fromIndex) {
return super.indexOf(str, fromIndex);
}
@Override
public int lastIndexOf(String str) {
return super.lastIndexOf(str);
}
@Override
public int lastIndexOf(String str, int fromIndex) {
return super.lastIndexOf(str, fromIndex);
}
@Override
public StringBuilder reverse() {
super.reverse();
return this;
}
@Override
public String toString() {
return new String(value, 0, count);
}
}
2. 主要特点
- 继承关系:
StringBuilder
继承自AbstractStringBuilder
,实现了Serializable
和CharSequence
接口。 - 非线程安全:
StringBuilder
中的方法没有使用synchronized
关键字,因此它是非线程安全的,但性能比StringBuffer
更高。 - 容量管理:构造方法提供了初始化容量的设置,内部通过
ensureCapacity
方法来动态扩展容量。
3. 常用方法
-
构造函数:
StringBuilder()
: 默认容量为 16。StringBuilder(int capacity)
: 指定容量。StringBuilder(String str)
: 以指定字符串初始化,并额外增加 16 的容量。StringBuilder(CharSequence seq)
: 以指定字符序列初始化,并额外增加 16 的容量。
-
追加和插入:
append(Object obj)
: 追加对象的字符串表示。append(String str)
: 追加字符串。append(CharSequence s)
: 追加字符序列。insert(int offset, Object obj)
: 在指定位置插入对象的字符串表示。insert(int offset, String str)
: 在指定位置插入字符串。insert(int dstOffset, CharSequence s)
: 在指定位置插入字符序列。
-
删除和替换:
delete(int start, int end)
: 删除指定范围的字符。deleteCharAt(int index)
: 删除指定位置的字符。replace(int start, int end, String str)
: 用指定字符串替换指定范围内的字符。
-
其他操作:
reverse()
: 反转字符串内容。toString()
: 返回字符串表示。
4. 与 StringBuffer
的区别
- 线程安全性:
StringBuilder
是非线程安全的,而StringBuffer
是线程安全的。 - 性能:由于
StringBuilder
没有同步开销,性能比StringBuffer
更高。
5. 示例代码
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
sb.insert(5, ",");
sb.delete(5, 6);
sb.replace(5, 6, ",");
System.out.println(sb.toString()); // 输出:Hello, World
sb.reverse();
System.out.println(sb.toString()); // 输出:dlroW ,olleH
}
}
通过上述分析,我们可以看到 StringBuilder
类的实现和使用方式。StringBuilder
提供了多种方法来操作字符串内容,并且由于其非线程安全性,性能更高,适合在单线程环境下使用。