StringBuffer源码解析

StringBuilder

StringBuffer是一个继承AbstractStringBuilder,实现SerializableCharSequence的类

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提供
posted @ 2024-05-08 13:38  勤匠  阅读(13)  评论(0)    收藏  举报