stringbuilder.insert()是java中直接在指定位置插入内容的核心方法,不生成新对象、修改原实例,支持14种重载类型、链式调用,索引范围为0到length()(含),负数或越界抛异常,末尾插入最快,中间插入性能较差。

StringBuilder.insert() 是 Java 中直接在指定位置插入内容的核心方法,不生成新对象、修改原实例,适合动态拼接、模板注入、日志格式化等场景。
insert 的索引规则和边界要点
插入位置由 offset 参数决定,它表示“在索引为 offset 的字符之前插入”,不是“第几个字符之后”。合法范围是 0 到 sb.length()(含):
- offset = 0 → 插入开头,如
new StringBuilder("bc").insert(0, "a")得到"abc" - offset = 1 → 插入第一个字符后、第二个字符前,如
insert(1, "X")把"ab"变成"aXb" - offset = sb.length() → 等价于 append,如
insert(3, "d")对"abc"结果是"abcd" - offset 为负数或大于 length() → 立即抛
StringIndexOutOfBoundsException
支持多种类型插入,无需手动转换
insert() 提供 14 种重载,自动调用 String.valueOf() 或按类型处理:
-
insert(2, 42)→ 插入字符串"42" -
insert(2, true)→ 插入"true" -
insert(2, 'Z')→ 插入单个字符'Z' -
insert(2, new char[]{'x','y'})→ 插入"xy" -
insert(0, null)→ 安全,插入字符串"null" -
insert(0, new StringBuilder("hi"))→ 按 CharSequence 处理,插入"hi"
链式调用与典型使用模式
insert() 返回 this,天然支持链式写法,减少中间变量:
-
sb.insert(5, " world").insert(0, "[").insert(sb.length(), "]")→ 快速包裹字符串 - 生成 SQL 片段:
new StringBuilder("SELECT * FROM users").insert(23, " WHERE status=1") - 日志模板填充:
new StringBuilder("[{}]").insert(1, "INFO").insert(6, " login success") - 注意:循环中插入需倒序操作,避免因长度变化导致后续索引偏移
性能与常见避坑提醒
insert() 效率取决于位置——末尾最快,中间最慢(内部数组需复制后半段):
- 频繁在中间插入(如每两个字符加一个分隔符)会退化为 O(n²),建议先收集所有插入点再批量构建
- 误写
sb.toString().insert(...)会编译失败,String 没有 insert 方法 - insert 不是线程安全的,多线程共享时需外部同步
- 不要依赖返回新对象:它始终修改原 StringBuilder,返回值仅用于链式调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











