stringbuilder通过可扩容char数组实现原地修改,避免频繁创建对象;初始容量16,扩容为1.5倍+1;append摊还o(1),delete/insert最坏o(n),setcharat严格o(1);tostring唯一生成新string;线程不安全但性能更高。

StringBuilder 实现高性能字符串修改,核心在于避免创建大量中间字符串对象,并通过可变的字符数组实现原地修改。
底层使用可扩容的 char 数组
StringBuilder 内部维护一个 char[] value,所有 append、insert、delete 等操作都直接在这个数组上进行,不生成新字符串对象。初始容量默认为 16,当数组空间不足时,会自动扩容(通常是当前容量的 1.5 倍 + 1),避免频繁分配内存。
- 扩容策略平衡了空间利用率和复制开销,比每次追加都新建 String 更高效
- 可通过构造函数指定初始容量(如 new StringBuilder(1024)),减少扩容次数,适合已知最终长度的场景
所有修改操作均为 O(1) 或摊还 O(1)
常见操作的时间复杂度如下:
- append():末尾追加,一般为 O(1),扩容时触发数组复制,但摊还后仍是 O(1)
- delete(int start, int end):移动后续字符,最坏 O(n),但只涉及数组内数据搬移,无对象创建
- insert(int offset, ...):在指定位置插入,需移动后续字符,也是 O(n),但全程在单一数组中完成
- setCharAt(int index, char ch):直接下标赋值,严格 O(1)
避免隐式 toString() 和重复构建
调用 toString() 会创建一个新的 String 对象(内部复制 char 数组),这是唯一产生新字符串的时机。因此:
- 不要在循环中反复调用 toString() 获取中间结果
- 如果只需最终结果,把所有修改做完再调用一次 toString()
- 若需多次读取当前内容且后续还要修改,可考虑缓存 length() 或 substring() 的结果,而非反复 toString()
线程不安全换来性能提升
StringBuilder 不做同步,方法没有 synchronized 修饰,相比 StringBuffer 省去了锁开销。这使其在单线程场景下更快。如果多线程共享使用,应改用 StringBuffer,或由外部同步控制。
不复杂但容易忽略:合理预估容量 + 集中修改 + 最后一次性转字符串,就能充分发挥 StringBuilder 的性能优势。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











