StringBuilder链式操作本质是方法返回this,所有修改操作均在原字符数组上进行,不产生中间字符串对象;关键API需注意区间左闭右开、null转"null"、预估容量提升性能。

Java中StringBuilder的链式操作本质是方法返回this,让多个调用可以连写;API使用关键在于理解“可变缓冲区”模型——所有操作都在同一块字符数组上进行,不产生中间字符串对象。
链式调用怎么写才自然
链式不是语法糖,而是设计选择。每个append、insert、delete等修改类方法都返回StringBuilder自身引用。
- 连续拼接直接连点:
sb.append("Name: ").append(name).append(", Age: ").append(age) - 混合操作也支持:
sb.append("abc").insert(0, "[").append("]").reverse() - 注意顺序:操作按代码从左到右执行,
insert(0, "X")会把"X"插到最前,后续append加在末尾
常用API要分清语义边界
很多方法名相似但行为不同,容易误用。重点看参数含义和区间规则:
-
delete(int start, int end)删的是[start, end),左闭右开。比如delete(2, 5)删下标2、3、4三个字符 -
replace(int start, int end, String str)也是[start, end)区间,用新字符串整体替换 -
charAt(int index)和deleteCharAt(int index)都基于单个索引,但前者只读,后者直接删 -
capacity()是底层数组长度,length()是当前有效字符数,两者常不相等
性能优化的实操细节
默认容量16,在大量拼接时频繁扩容反而拖慢速度。实战中建议预估长度并指定初始容量:
立即学习“Java免费学习笔记(深入)”;
- 循环拼接1000个数字+分隔符,预估长度约5000,可写
new StringBuilder(5000) - 构造时传入字符串,如
new StringBuilder("prefix"),内部容量=字符串长度+16 - 拼接完成后调用
toString()生成不可变String,此时才真正创建新对象 - 如果确定后续不再修改,可调用
trimToSize()释放多余数组空间
空值与边界情况处理
StringBuilder对null有明确约定,但需主动留意:
-
append(null)会写入字符串"null",不是抛异常 -
insert(0, null)同理,插入的是"null"字面量 - 索引越界(如
insert(100, "x")在空builder上调用)会抛StringIndexOutOfBoundsException - 删除或替换时若
start > length()或end > length()也会触发异常


















