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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现