capacity是内部字符数组总容量,length是当前有效字符数;前者决定扩容阈值,后者反映实际内容长度,二者数值常不同且作用迥异。

capacity 是内部字符数组能装多少字符,length 是当前实际装了多少字符——两者数值经常不同,但作用完全不同。
length 表示当前字符串的实际长度
它返回的是 StringBuilder 中已写入的有效字符个数,也就是你用 append、insert、delete 等方法操作后“看得见”的内容长度。
- 空 StringBuilder 调用
length()返回 0 -
new StringBuilder("hello").length()返回 5 - 每次
append("x")或delete(0,1)都会实时改变 length
capacity 表示底层 char[] 数组的总大小
它反映的是 StringBuilder 内部缓冲区的容量上限,不是当前用了多少,而是“最多还能塞多少而不扩容”。
-
new StringBuilder()默认 capacity 是 16 -
new StringBuilder("abc")的 capacity 是 16 + 3 = 19(初始字符串长度 + 16) - 当
length() > capacity()时,系统自动扩容:新容量通常为旧 capacity * 2 + 2
常见误区和坑点
别拿 capacity 当字符串长度用,也别以为 capacity 不变就说明没扩容——它只在真正需要时才变。
- 传单个 char(如
new StringBuilder('a'))会误调 int 构造器,capacity 变成 ASCII 值 97,length 却是 0 - 用
delete()删除内容只影响 length,capacity 保持不变 - 扩容不是每次 append 都发生,而是按需触发,比如从 16 → 34 → 70 这样阶梯式增长
怎么查和控制它们
你可以随时用 length() 和 capacity() 查看当前状态;若想预留空间避免频繁扩容,可用带 int 参数的构造器或 ensureCapacity(int) 方法。
-
new StringBuilder(100)直接设初始 capacity 为 100 -
sb.ensureCapacity(200)确保 capacity 至少为 200(不足则扩容) -
sb.trimToSize()把 capacity 缩到刚好等于 length,节省内存(但之后再 append 又会扩容)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











