先说说核心结论:给 StringBuilder 指定初始容量,说白了就是为了省去频繁扩容带来的性能开销。扩容这事儿,说白了就是数组拷贝,一次两次还好,次数多了,性能损耗就上来了。提前预估好大小,就能把扩容次数降到最低,甚至直接归零。

Ja va中 StringBuilder 构造函数 pre-size 指定初始容量怎么减少扩容

那么,具体怎么做?

预估总长度,一步到位

最直接的办法,就是在创建 StringBuilder 之前,把最终字符串的长度算个大概,然后直接传给构造方法。比如你要拼接固定字符串和变量,可以手动加一加:

举个例子:new StringBuilder(6 + name.length() + 4 + ageStr.length()),对应 "Name: " + name + ", Age: " + age 这种拼接。这样,内部数组从一开始就够用,性能自然最优。

ensureCapacity() 兜底

如果构造时实在没法精确估算,比如逻辑比较复杂,那可以在拼接之前主动调用 ensureCapacity(int minimumCapacity)。这个方法会强制保证内部数组至少有指定容量,不够的话一次扩容到目标大小:

警惕过度预留,别浪费内存

容量设大固然能防扩容,但也不是越大越好。设得太大,尤其在大量短生命周期对象的场景下,堆内存压力会明显上升:

看看默认容量,就明白扩容代价了

StringBuilder() 默认容量是 16。一旦超出,JDK 8 的扩容公式是 newCapacity = oldCapacity * 2 + 2,JDK 17+ 则是 oldCapacity + (oldCapacity >> 1),也就是 1.5 倍。连续扩容意味着多次数组复制,每次都要把已有内容全部拷贝一遍:

本文转载于:https://www.php.cn/faq/2823578.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。