java中stringbuilder默认初始容量为16,扩容公式为newcapacity = oldcapacity × 2 + 2,并取该值与“count + 新增长度”中的较大者作为最终容量;无参构造得容量16,传入字符串则为字符串长度加16,显式指定容量即直接采用。

Java 中 StringBuilder 默认初始容量是 16,扩容不是简单翻倍,而是按公式 newCapacity = oldCapacity × 2 + 2 计算,并始终确保新容量不小于“当前已用长度 + 新增字符数”。
初始容量怎么定的
初始容量取决于构造方式:
-
无参构造(
new StringBuilder())→ 底层数组value.length == 16 -
传入字符串(
new StringBuilder("abc"))→ 容量 = 字符串长度 + 16,即3 + 16 = 19 -
显式指定容量(
new StringBuilder(32))→ 容量直接为 32,不额外加偏移
扩容什么时候触发
扩容发生在每次 append、insert 等修改操作执行前,判断依据是:
-
count:当前已写入字符数(即length()返回值) -
value.length:底层数组当前长度(即capacity()返回值) - 只要
count + 新增字符长度 > value.length,就立即触发扩容
注意:不是等数组“填满”才扩。比如 capacity=16、count=15,再 append 一个长度为 2 的字符串(15+2=17),也会触发扩容。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
扩容怎么算新容量
扩容分两步确定最终容量:
- 先按公式算基础值:
newCapacity = oldCapacity × 2 + 2(等价于old ) - 再与“最小所需容量”(即
count + 新增字符数)比较,取较大者 - 最终结果不能超过
Integer.MAX_VALUE - 8,否则抛OutOfMemoryError
举例:
- 初始 16,追加 20 字符 → 需 20,公式得 34 → 取 34
- 初始 16,追加 50 字符 → 需 50,公式得 34 → 取 50
扩容实际做了什么
扩容本质是一次内存重分配,包含三个关键动作:
- 调用
Arrays.copyOf(value, newCapacity)分配新char[] - 把原数组内容完整复制过去(开销为 O(n),随数据量上升明显)
- 将
value引用指向新数组,旧数组等待 GC 回收
这个过程涉及堆内存分配和系统级拷贝,频繁触发会带来明显性能抖动。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










