java中用stringbuilder构造自定义字符串的核心是避免频繁创建string对象以提升性能,它通过可变char[]缓冲区复用实例,支持append、insert、delete等操作,适合循环拼接、动态构建场景,但非线程安全。

Java中用StringBuilder构造自定义字符串,核心是避免频繁创建String对象,提升性能。它适合在循环拼接、动态构建字符串(如SQL、JSON、日志消息)等场景使用。
为什么不用“+”或String.concat()?
直接用“+”拼接字符串在编译期会被优化为StringBuilder(仅限常量),但运行时(尤其在循环内)每次“+”都会生成新String对象,触发大量临时对象和GC压力。String.concat()同样返回新String,不可变性导致开销累积。
- String是不可变的,每次拼接都新建对象
- StringBuilder是可变的,内部用char[]缓冲区,append操作复用同一实例
- 初始容量未指定时,默认16字符;若预估长度较大,建议构造时指定容量,减少数组扩容次数
常用构造与追加操作
从创建到组装,关键在于合理调用append系列方法,并注意类型自动转换逻辑。
- new StringBuilder():默认容量,适合小量拼接
- new StringBuilder(128):预分配足够空间,避免多次扩容
- append(Object):对null输出"null"字符串,不是空指针异常
- append(char[])、append(CharSequence)、append(int/long/boolean):支持多种类型,无需手动toString()
- insert(int offset, ...)和delete(int start, int end)可用于中间插入或删减,但慎用——破坏顺序性且影响性能
构建带分隔符的字符串(如CSV、参数列表)
这是高频需求,别手写循环+判断首尾逗号。推荐两种稳妥方式:
- 先append第一个元素,再对后续每个元素执行“append(',').append(item)”
- 用StringJoiner(Java 8+)更语义化,但若需精细控制(如嵌套结构、条件拼接),StringBuilder仍更灵活
- 示例:拼接非空字符串列表,跳过null或空白项:
for (String s : list) { if (s != null && !s.trim().isEmpty()) { sb.append(s).append(","); } }
最后用sb.deleteCharAt(sb.length()-1)删掉末尾逗号(注意判空)
线程安全与替代选择
StringBuilder是非线程安全的,多线程共用同一实例会导致数据错乱。如需并发拼接:
- 每个线程各自new一个StringBuilder,最常用也最高效
- 用StringBuffer(同步方法),但锁粒度粗,性能明显低于StringBuilder
- Stream.collect(Collectors.joining())适合简单聚合,但定制逻辑(如格式化、过滤)受限
- 不要在循环外复用StringBuilder并试图“清空重用”——调用setLength(0)比新建对象快,但需确保无其他引用,且逻辑清晰不易出错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











