stringbuilder的insert()方法在指定索引处插入字符序列,不创建新对象,高效构建动态文本;支持多种重载、索引范围为0≤offset≤length(),需注意性能与线程安全。

StringBuilder 的 insert() 方法能直接在指定索引处插入字符序列,不创建新对象,比字符串拼接快得多,是高效构建动态文本的核心手段。
insert() 的基本用法和索引规则
insert(int offset, String str) 将 str 插入到当前 StringBuilder 对象的 offset 位置(从 0 开始计数)。注意:offset 必须满足 0 ≤ offset ≤ length(),等于 length() 时等效于 append()。
- 索引 0 表示开头;索引 length() 表示末尾(合法)
- 插入后原内容自动后移,长度增加 str.length()
- 若 offset 超出范围,抛出 StringIndexOutOfBoundsException
常用插入场景与写法示例
实际开发中常用于格式化、模板填充、协议拼装等。例如:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 在 JSON 字符串 key 后插入冒号和空格:
sb.insert(5, ": ")(假设 "name" 占 4 位,索引 4 是 'e',5 就是冒号位置) - 向日志前补时间戳:
sb.insert(0, "[2024-06-15 10:20:30] ") - 在 SQL 拼接中插入 WHERE 条件:
sb.insert(sql.lastIndexOf(")"), " AND status=1")
插入多种类型数据的重载方法
insert() 有多个重载版本,支持直接插入基本类型和对象,无需手动转 String:
-
insert(3, 123)→ 插入字符串 "123" -
insert(0, true)→ 插入 "true" -
insert(5, new char[]{'a','b','c'})→ 插入 "abc" -
insert(2, "hello", 1, 3)→ 插入子串 "el"(从索引 1 到 3,不包含 3)
性能提示与避坑建议
insert() 虽高效,但频繁在中间插入仍涉及数组复制,影响性能:
- 尽量避免在长 StringBuilder 中高频调用 insert()(尤其偏前位置)
- 若需多次“头插”,可先用 List
收集片段,最后 reverse + append - 插入前确认容量:capacity() 不足会触发扩容(可能复制整个数组),必要时用
ensureCapacity(足够大的值) - 多线程环境不能共享 StringBuilder 实例,应使用 StringBuffer 或加锁
掌握 insert 的索引逻辑和适用边界,配合合理预估容量,就能在文本组装中兼顾简洁性与执行效率。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










