发布于2026-07-15 阅读(0)
扫一扫,手机访问
先说说核心结论:给 StringBuilder 指定初始容量,说白了就是为了省去频繁扩容带来的性能开销。扩容这事儿,说白了就是数组拷贝,一次两次还好,次数多了,性能损耗就上来了。提前预估好大小,就能把扩容次数降到最低,甚至直接归零。

那么,具体怎么做?
最直接的办法,就是在创建 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)。这个方法会强制保证内部数组至少有指定容量,不够的话一次扩容到目标大小:
capacity(),不影响 length(),也就是不会改变已有的内容容量设大固然能防扩容,但也不是越大越好。设得太大,尤其在大量短生命周期对象的场景下,堆内存压力会明显上升:
StringBuilder() 默认容量是 16。一旦超出,JDK 8 的扩容公式是 newCapacity = oldCapacity * 2 + 2,JDK 17+ 则是 oldCapacity + (oldCapacity >> 1),也就是 1.5 倍。连续扩容意味着多次数组复制,每次都要把已有内容全部拷贝一遍:
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8