capacity() 返回的是 StringBuilder 内部 char[] 数组的当前长度,即缓冲区能容纳的最大字符数;新建空对象默认容量为16,指定字符串时为字符串长度加16,扩容策略通常为原容量×2+2。

Java 中 StringBuilder 的 capacity() 方法用于获取当前对象底层字符缓冲区的总容量(即数组长度),而不是当前字符串长度。这个值通常大于或等于 length(),因为 StringBuilder 会预留额外空间以减少扩容开销。
capacity() 返回的是什么?
capacity() 返回的是内部 char[] 数组的当前大小,也就是缓冲区能容纳的最大字符数,不包括末尾的 null 终止符(Java 字符串无此概念)。它反映的是已分配内存的“容量”,不是“用了多少”。
- 新建空 StringBuilder 时,默认容量是 16
- 如果构造时指定字符串,容量 = 字符串长度 + 16(除非指定初始容量)
- 当追加内容超出当前容量时,StringBuilder 自动扩容(通常是原容量 * 2 + 2)
如何查看和验证 capacity
直接调用 capacity() 方法即可:
StringBuilder sb = new StringBuilder("hello");
System.out.println(sb.length()); // 输出:5
System.out.println(sb.capacity()); // 输出:21(5 + 16)
sb.append(" world".repeat(5));
System.out.println(sb.capacity()); // 可能变成 46 或更大,取决于扩容策略capacity 和 length 的区别要分清
length() 是当前有效字符个数;capacity() 是底层 char 数组的长度。二者常被混淆:
立即学习“Java免费学习笔记(深入)”;
- 修改字符串(如 append、delete、replace)只影响
length(),可能触发扩容从而改变capacity() - 调用
ensureCapacity(int minimumCapacity)可主动扩大容量,避免频繁自动扩容 - 调用
trimToSize()可将容量缩小到当前 length,释放冗余空间
实际使用建议
一般不需要主动关注 capacity,但以下场景值得注意:
- 性能敏感场景:预估最终长度,用带初始容量的构造器(如
new StringBuilder(1024))减少扩容次数 - 内存敏感场景:大量构建短字符串后长期持有,可调用
trimToSize()回收多余空间 - 调试或分析内存占用时,
capacity()可帮助判断是否过度预留


















