应使用 stringbuilder 替代 string 拼接:string 不可变导致循环中频繁创建新对象、触发 gc;编译器仅优化字面量拼接,含变量时每轮都新建 stringbuilder;预估容量可避免多次扩容复制。

因为每次用 + 拼接都会创建新对象,循环次数一多,内存和 CPU 开销就急剧上升。
String 不可变导致反复新建对象
Java 中的 String 是不可变类。每次执行 s = s + item,实际是:用旧字符串内容和新内容一起复制进一个全新的 String 对象,原对象被丢弃。循环 10000 次,就生成 10000 个中间 String 实例,大量对象进入堆内存,频繁触发 GC。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
编译器对 + 的处理并不优化循环场景
- 纯字面量拼接(如
"a" + "b")会在编译期合并,无运行时开销 - 但只要含变量(如
s + item),编译后等价于:new StringBuilder().append(s).append(item).toString() - 也就是说,每轮循环都在重复:新建 StringBuilder → append → toString → 丢弃实例
StringBuilder 复用实例避免重复开销
它内部维护一个可变的 char 数组,所有 append 操作都在原地修改,不产生中间字符串:
- 循环外初始化一次:
StringBuilder sb = new StringBuilder(预估容量); - 循环内只调用
sb.append(...),支持 int、boolean、String 等多种类型 - 循环结束后统一调用一次
sb.toString()
容量预估能显著减少扩容成本
StringBuilder 默认初始容量是 16。若拼接内容总长远超此值,就会多次扩容(16 → 34 → 70 → 142…),每次扩容都要复制已有全部字符。例如拼接 500 个平均 30 字符的字符串,加逗号分隔,总长 ≈ 15500,直接写 new StringBuilder(16000) 就比默认快得多。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










