如何通过StringBuilder的capacity()和ensureCapacity()方法避免超长文本拼接时的重复扩容问题?
- 内容介绍
- 相关推荐
本文共计702个文字,预计阅读时间需要3分钟。
StringBuilder在拼接大量文本时,内部字符数组会动态扩容。频繁的扩容(尤其是小步增长)会导致多次数组复制,显著降低性能。合理使用capacity()和ensureCapacity(int)可以提前预留足够空间,避免重复分配与复制。
理解 capacity() 的实际含义
capacity() 返回的是当前内部数组的总长度(不是字符串长度 length()),即还能容纳多少个额外字符而不触发扩容。例如:
StringBuilder sb = new StringBuilder("abc"); // length=3, capacity=16(默认初始容量) sb.ensureCapacity(100); // 扩容后 capacity ≥ 100,比如变成 100 或 112 System.out.println(sb.capacity()); // 输出 ≥100 的值
注意:JDK 实现中扩容策略通常是「当前 capacity × 2 + 2」,但具体数值不需强记,关键是通过 capacity() 观察当前余量,辅助判断是否需要预分配。
本文共计702个文字,预计阅读时间需要3分钟。
StringBuilder在拼接大量文本时,内部字符数组会动态扩容。频繁的扩容(尤其是小步增长)会导致多次数组复制,显著降低性能。合理使用capacity()和ensureCapacity(int)可以提前预留足够空间,避免重复分配与复制。
理解 capacity() 的实际含义
capacity() 返回的是当前内部数组的总长度(不是字符串长度 length()),即还能容纳多少个额外字符而不触发扩容。例如:
StringBuilder sb = new StringBuilder("abc"); // length=3, capacity=16(默认初始容量) sb.ensureCapacity(100); // 扩容后 capacity ≥ 100,比如变成 100 或 112 System.out.println(sb.capacity()); // 输出 ≥100 的值
注意:JDK 实现中扩容策略通常是「当前 capacity × 2 + 2」,但具体数值不需强记,关键是通过 capacity() 观察当前余量,辅助判断是否需要预分配。

