stringbuilder比string拼接快因其可变性,复用内部数组避免频繁对象创建;与stringbuffer仅差synchronized,线程安全需共享实例才必要;反转用reverse()方法,双指针实现o(n)时间复杂度。

为什么 StringBuilder 比 String 拼接快?
因为 String 每次拼接(比如 s += "x")都生成新对象,旧对象留在堆里等 GC;而 StringBuilder 在内部 char[](Java 9+ 是 byte[])上直接追加、扩容,复用同一块内存。
- 循环拼接 10000 次数字,String 方式可能创建上万个临时对象;StringBuilder 只需 1 个实例 + 若干次数组扩容
- 编译器虽会把 "a" + s + "c" 自动转成 StringBuilder 调用,但那是编译期优化——写代码时仍建议显式用 StringBuilder,语义更清晰、可控性更强
StringBuilder 和 StringBuffer 到底差在哪一行?
只差 synchronized 关键字。翻 JDK 源码就能验证:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- StringBuffer 的 append()、insert()、delete() 方法都带 public synchronized XXX
- StringBuilder 对应方法完全没加 synchronized,其他逻辑(如扩容策略、字符拷贝)几乎一模一样
- 所以不是“功能不同”,而是“是否默认帮你加锁”——多线程共享同一个 StringBuilder 实例才真出问题;各自 new 各自用,根本不需要同步
什么情况下必须用 StringBuffer?
仅当多个线程**并发读写同一个 StringBuffer 实例**时才需要它。现实中这种情况极少。
- 常见误用:把 StringBuffer 当“更高级的 StringBuilder”传参,结果白白承担锁开销
- 现代写法推荐:方法内局部变量用 StringBuilder;若需跨线程传递字符串结果,用不可变 String 或构建完再转 String,避免共享可变状态
- 注意:StringBuffer 的 synchronized 是方法级锁,粒度粗,高并发下仍是瓶颈,真要高性能并发拼接,考虑无锁方案(如 ThreadLocal
)
StringBuilder 如何反转字符串?
最简方式就是调用内置 reverse() 方法:
- new StringBuilder("hello").reverse().toString() → "olleh"
- 底层是双指针交换字符,时间复杂度 O(n),空间 O(1)(不计返回新 String 的开销)
- 别手写循环或递归反转——除非面试官明确考算法,否则直接用 reverse() 是最优解,体现对 API 的熟悉和工程意识
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










