java字符串拼接应选对工具:循环内必须用stringbuilder(声明在外、复用实例、最后tostring)、预估容量避免扩容、集合转字符串优先string.join、常量拼接由编译器优化。

Java中字符串拼接开销主要来自String的不可变性——每次用+拼接都会生成新对象,尤其在循环中会快速堆积临时对象,加重GC压力。关键不是“少拼接”,而是“选对工具”。
循环内拼接必须用StringBuilder
在for/while循环里拼接字符串,绝不能写result += "item" + i。JVM每次都会隐式创建StringBuilder→append→toString,1000次循环可能产生上千个短命对象。
- 正确做法:把StringBuilder声明在循环外,复用同一实例
- 追加时直接调用
append(),不要中间转String - 只在最后一步调用
toString()获取最终结果
预估容量能避免多次扩容
StringBuilder底层是char数组(JDK9+为byte数组),默认初始容量16。如果拼接结果约4000字符,却没指定容量,过程中可能触发5–6次数组复制,白白消耗CPU。
- 简单估算:每个元素平均长度 × 元素数量 + 分隔符总长
- 示例:
new StringBuilder(4096)比无参构造快10%–20% - 不确定时宁可略大,不建议过小
集合转字符串优先用String.join
当目标只是把List或Array按固定分隔符连成一个字符串,String.join()比手写循环+StringBuilder更简洁且已内部优化。
- 适用场景:日志参数拼接、CSV行生成、URL参数组装等
- 示例:
String.join(", ", list)自动处理null安全与边界分隔 - 不用自己判断是否第一个元素,也不用删掉末尾多余逗号
常量拼接交给编译器,别手动干预
像"Hello" + "World"或"v" + 1 + "." + 2这种全由字面量和编译期常量组成的表达式,javac会直接合并成一个字符串常量,运行时零开销。
- 含变量就失效:只要出现
i、user.getName()这类运行时值,+就退化为低效操作 - 日志语句如
log.info("ID=" + id)在高频循环中也要重构 - 不必为了“统一风格”把所有+都改成StringBuilder,看上下文
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











