append总是在末尾追加内容,insert在指定索引位置插入内容;前者适合顺序拼接,后者适用于结构化修改,二者分工明确、不可互替。

Java 中 StringBuilder 的 append 和 insert 是两个最常用、也最容易混淆的核心方法。它们都用于向字符串序列中添加内容,但作用位置和适用场景截然不同:append 总是加在末尾,insert 则精准控制插入点。
append:高效追加,适合顺序拼接
append 方法把数据直接添加到当前 StringBuilder 的末尾,不改变已有内容的位置,执行快、语义清晰。
- 支持多种类型:字符串、字符、数字、布尔值、对象(自动调用 toString)
- 返回 this,天然支持链式调用,比如
sb.append("Name: ").append(name).append("\nAge: ").append(age) - 底层复用内部 char 数组,避免频繁创建新对象,比 String 拼接(如
s += "x")节省内存和时间 - 典型场景:日志组装、SQL 动态拼接、表单数据格式化、循环内累积内容
insert:定点插入,适合结构化修改
insert 在指定索引位置插入内容,原位置及之后的字符会自动后移,适合需要“中途插话”的情况。
- 索引从 0 开始,合法范围是
0 ≤ offset ≤ currentLength(等于长度时等效于 append) - 越界会抛
StringIndexOutOfBoundsException,例如长度为 3 时,offset=4 就非法 - 同样支持多类型重载:
insert(2, 456)插入字符串 "456",insert(0, 'X')插入单个字符 - 也支持链式调用:
sb.insert(0, "[").insert(sb.length(), "]")可快速包裹字符串
append 和 insert 的关键区别
两者不是替代关系,而是分工明确:
立即学习“Java免费学习笔记(深入)”;
- 位置逻辑不同:append 不关心当前位置,只管“堆在最后”;insert 必须传入有效 offset,否则运行时报错
- 性能影响略有差异:append 是 O(1) 均摊复杂度;insert 在中间插入时需移动后续字符,是 O(n),但对多数业务场景影响可忽略
- 语义意图不同:append 表达“继续写”,insert 表达“在这里补一句”——选哪个,取决于你心里想的是流程还是结构
- 初始化习惯不同:构建新字符串时多用 append;改造已有字符串(如加前缀、插分隔符、补括号)首选 insert
实际组合用法示例
真实开发中,二者常配合使用。例如生成带编号的 SQL INSERT 语句:
StringBuilder sql = new StringBuilder("INSERT INTO users (name, age) VALUES ");
sql.append("("); // 先追加开头括号
sql.insert(sql.length(), ", "); // 在末尾插入逗号空格(等效 append(", "))
sql.insert(sql.length() - 2, "'Alice'"); // 在逗号前插入名字
sql.insert(sql.length() - 2, "28"); // 再往前插入年龄
sql.append(");"); // 补结尾
// 结果:"INSERT INTO users (name, age) VALUES ('Alice', 28);"
更简洁的写法其实是先用 insert 定好框架,再用 append 填值,或全程链式调用 —— 关键是理解每个操作在字符串中的落点。


















