指定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()
虽然大容量能防扩容,但过大会占用不必要的堆内存,尤其在大量短生命周期对象中:
StringBuilder() 默认容量是 16。一旦超出,会按公式 newCapacity = oldCapacity * 2 + 2 扩容(JDK 17+ 为 oldCapacity + (oldCapacity >> 1),即 1.5 倍)。连续扩容多次意味着多次数组复制,耗时呈阶梯增长: