StringBuilder
在阅读 StringBuilder 请先点此阅读其父类 AbsractStringBuilder 的源码,便于理解。因为 StringBuilder 的很多方法是直接调用父类方法实现的。
-
StringBuilder 继承自 AbstractStringBuilder,实现了 Serializable、Comparable、CharSequence 接口。
-
StringBuilder 被 final 修饰,表示不可以被继承。
-
StringBuilder 是线程不安全的可变字符序列,但效率高。 StringBuffer 是线程安全的可变字符序列,但效率低。
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, Comparable<StringBuilder>, CharSequence{
}
构造方法:
StringBuilder()
默认初始化字符串容量为16。调用父类构造方法 AbstractStringBuilder(int capacity) 实现。
关于注解 @HotSpotIntrinsicCandidate 点此查看详细介绍。
@HotSpotIntrinsicCandidate
public StringBuilder() {
super(16);
}
StringBuilder(int)
创建一个初始化容量为 capacity 的空字符序列。调用父类构造方法 AbstractStringBuilder(int capacity) 实现。
@HotSpotIntrinsicCandidate
public StringBuilder(int capacity) {
super(capacity);
}
StringBuilder(String)
创建一个初始化内容为字符串str的字符序列,调用父类构造方法 AbstractStringBuilder(String str) 实现。
@HotSpotIntrinsicCandidate
public StringBuilder(String str) {
super(str);
}
StringBuilder(CharSequence)
创建一个初始化内容为seq的字符序列,调用父类构造方法 AbstractStringBuilder(CharSequence seq) 实现。
public StringBuilder(CharSequence seq) {
super(seq);
}
toString()
将字符序列复制一份以String对象返回。注意:是通过拷贝一份新字符串返回,而不是将原字符序列返回。
@Override
@HotSpotIntrinsicCandidate
public String toString() {
// Create a copy, don't share the array
return isLatin1() ? StringLatin1.newString(value, 0, count)
: StringUTF16.newString(value, 0, count);
}
public static String newString(byte[] val, int index, int len) {
return new String(Arrays.copyOfRange(val, index, index + len), LATIN1);
}
writeObject()
私有方法,将字符序列写入到对象输出流中
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {
s.defaultWriteObject();
s.writeInt(count);
char[] val = new char[capacity()];
if (isLatin1()) {
StringLatin1.getChars(value, 0, count, val, 0);
} else {
StringUTF16.getChars(value, 0, count, val, 0);
}
s.writeObject(val);
}
- 写入字符序列的长度。
- 将字符序列复制到char数组中。
- 将char数组val写入到输出流。
readObject()
私有方法,从对象输入流中读取字符序列。
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
count = s.readInt();
char[] val = (char[]) s.readObject();
initBytes(val, 0, val.length);
}
- 读取字符序列的长度。
- 将字符序列读取到char数组中。
- 调用父类 initBytes() 方法将char数组val转换为字节数组,并将该字符序列赋给当前对象。
其他方法
其他 compareTo(StringBuilder) 、append()系列 、 insert()系列 、 delete() 、 indexOf() 等方法均为调用父类AbstractStringBuilder中的方法实现。 具体请点击参考关于 AbstractStringBuilder 的源码分析。