java字符串拼接与格式化应按场景选工具:简单动态拼接用stringbuilder(预估容量、链式append),复杂模板用string.format()或java 15+的formatted(),多行内容用文本块;避免循环+=、未判级格式化日志及sql拼接用户输入。

Java中高效拼接和格式化字符串,关键在于根据场景选择合适工具:简单拼接用StringBuilder,复杂模板用String.format()或MessageFormat,现代开发推荐String.formatted()(Java 15+)和文本块(Java 15+)。
用 StringBuilder 做高性能动态拼接
当需要在循环、条件分支中多次追加内容(如构建SQL、日志、HTML片段),StringBuilder比+或String.concat()快得多,避免创建大量中间字符串对象。
- 初始化时预估容量(如
new StringBuilder(256)),减少数组扩容开销 - 链式调用
append()支持多种类型:append("id=").append(id).append(", name=").append(name) - 多线程环境用
StringBuffer(线程安全但稍慢),单线程一律选StringBuilder
用 String.format() 和 formatted() 做类型安全的格式化
适合固定结构、含变量占位符的字符串(如日志消息、错误提示),自动处理类型转换与对齐。
String.format("User %s (ID: %d) logged in at %tF %tR", name, id, now, now)- Java 15起可直接用实例方法:
"User %s (ID: %d)".formatted(name, id),更简洁且编译期检查占位符数量 - 注意:格式异常(如类型不匹配、参数不足)会抛
IllegalFormatException,建议配合单元测试覆盖边界情况
用文本块(Text Blocks)简化多行字符串与内嵌格式
Java 15+ 支持三重引号"""定义多行字符串,天然保留缩进与换行,特别适合SQL、JSON模板、HTML片段。
- 自动去除公共前导空格,用
\续行控制缩进:""" SELECT * FROM users WHERE status = ? \n ORDER BY created_at DESC """ - 结合
formatted()插入变量:""" INSERT INTO logs (msg, level) VALUES ("%s", "%s") """.formatted(message, level) - 避免手动拼接换行符
\n和引号转义,提升可读性与维护性
避免常见低效写法
以下方式在高频或大数据量场景会显著拖慢性能或引发隐患:
- 循环内用
+=拼接字符串(每次生成新String对象) - 用
String.format()拼接超长日志(格式化本身有开销,建议先判断日志级别再格式化) - 拼接SQL时直接插入用户输入(必须用PreparedStatement防止注入,而非字符串拼接)
- 过度依赖
String.join()处理非扁平数据(如嵌套列表),应先用stream().map().collect()预处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











