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 @   勤匠  阅读(7)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示