最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java中 StringBuilder 构造函数 pre-size 指定初始容量怎样减少扩容
时间:2026-07-27 08:00:48 编辑:袖梨 来源:一聚教程网
指定StringBuilder初始容量的核心目的是避免频繁扩容以提升性能;需预估总长度并设为构造参数,或用ensureCapacity()预留空间,但应避免过度预分配浪费内存。
指定 StringBuilder 构造函数的初始容量(pre-size),核心目的是避免频繁扩容,从而提升字符串拼接性能。扩容本身涉及数组复制,开销不小;提前预估并设置足够大的初始容量,就能显著减少甚至消除扩容次数。
预估总长度再设初始容量
最直接有效的方式是:在创建 StringBuilder 前,尽可能准确估算最终字符串的总长度,并以此作为构造参数。例如拼接固定字符串和若干变量时,可手动加总:
- 已知字符串字面量长度(如
"Hello "是 6) - 变量调用
.toString().length()或按类型预估(如 int 最多 11 位,long 最多 20 位) - 加上分隔符、换行符等额外字符数
示例:new StringBuilder(6 + name.length() + 4 + ageStr.length())(对应 "Name: " + name + ", Age: " + age)
用 ensureCapacity() 主动预留空间
如果构建逻辑较复杂,无法在构造时精确预估,可在创建后、拼接前调用 ensureCapacity(int minimumCapacity)。它会确保内部数组至少有指定容量,不足则扩容一次到位:
立即学习“Java免费学习笔记(深入)”;
- 比边拼接边扩容更可控
- 适合“先收集数据,再批量拼接”的场景
- 注意:该方法不改变当前
length(),只影响capacity()
避免过度预分配浪费内存
虽然大容量能防扩容,但过大会占用不必要的堆内存,尤其在大量短生命周期对象中:
- 不要盲目设几千或上万,除非真需要
- 对不确定长度的场景,可结合经验值(如日志消息通常
- JVM 对小对象内存分配优化较好,适度预留(如 64、128、256)往往性价比更高
对比默认容量理解扩容代价
StringBuilder() 默认容量是 16。一旦超出,会按公式 newCapacity = oldCapacity * 2 + 2 扩容(JDK 17+ 为 oldCapacity + (oldCapacity >> 1),即 1.5 倍)。连续扩容多次意味着多次数组复制,耗时呈阶梯增长:
- 16 → 34 → 52 → 79 …… 每次都要拷贝全部已有内容
- 若最终需 1000 字符,从 16 开始要扩容约 6 次;设初始为 1024 则零扩容