StringBuffer源码解析
StringBuilder
StringBuffer是一个继承AbstractStringBuilder,实现Serializable和CharSequence的类
StringBuffer 类的继承实现关系
public final class StringBuffer extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{
// 这里不粘贴源码
}
初始化
//无参构造器
public StringBuffer() {
super(16);//调用父类AbstractStringBuilder构造器
}
//有参构造器,还有很多构造器,感兴趣自己看源码
public StringBuffer(String str) {
super(str.length() + 16);//调用父类AbstractStringBuilder构造器
append(str);
}
AbstractStringBuilder构造器
char[] value;
AbstractStringBuilder(int capacity) {
value = new char[capacity];//new char[16]赋给value
}
append
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);//调用父类AbstractStringBuilder.append方法
return this;
}
AbstractStringBuilder.append方法
int count;//记录value[]长度,初始化时值为0
char[] value;//存储字符串
public AbstractStringBuilder append(String str) {
// 检查str是否为null,为null返回一个{'n','u','l','l'}的char[]数组
if (str == null)
return appendNull();
int len = str.length();// 获取字符串长度
// 确保容量:容量不足则为char[] value扩容
ensureCapacityInternal(count + len);//count初始化值为0,所以这里传递的是
// 将str的数据追加到value中
str.getChars(0, len, value, count);//由System.arraycopy实现,getChars源码很简单,不粘贴了
count += len;// 更新value长度:长度+字符串长度=当前value长度
return this;
}
appendNull 方法
private AbstractStringBuilder appendNull() {
int c = count;//初始化时count=0
ensureCapacityInternal(c + 4);
final char[] value = this.value;
value[c++] = 'n';
value[c++] = 'u';
value[c++] = 'l';
value[c++] = 'l';
count = c;
return this;
}
ensureCapacityInternal 确保内部容量
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
// 容量不足,则为char[] value扩容
value = Arrays.copyOf(value, newCapacity(minimumCapacity));
}
}
由源码可知
StringBuilder是一个线程安全类- 当
new StringBuilder对象时,无数据传入,生成一个{'n','u','l','l'}的char[]数组 StringBuilder大量方法由父类AbstractStringBuilder实现,存储数据的value也由AbstractStringBuilder提供
本文来自博客园,作者:勤匠,转载请注明原文链接:https://www.cnblogs.com/JarryShu/articles/18179500

浙公网安备 33010602011771号