String、StringBuffer和StringBuilder的区别
约 441 字大约 1 分钟
2025-09-04
三者的核心区别主要体现在不可变性、线程安全性和性能三个方面,主要应用于 Java 字符串处理场景。
String
- 不可变性:String 对象一旦创建,其内容不可修改。任何修改操作(如拼接、替换)都会生成新的 String 对象。
- 线程安全:由于不可变性,多线程环境下可安全共享同一 String 对象,无需额外同步措施。
- 性能影响:频繁修改会导致大量对象创建和垃圾回收,降低性能。
- 适用场景:字符串内容不常变化的场景(如配置信息)。
StringBuffer
- 可变性:允许直接修改对象内容(如
append()、insert()),不会创建新对象。 - 线程安全:所有关键方法使用
synchronized修饰,保证多线程环境下的操作安全。
- 性能特点:线程安全机制带来额外性能开销。
- 适用场景:多线程环境下需要频繁修改字符串(如并发日志处理)。
StringBuilder
- 可变性:与 StringBuffer 类似,支持原位修改操作。
- 非线程安全:方法未同步,多线程操作可能导致数据不一致。
- 性能特点:无同步开销,单线程下性能优于 StringBuffer(通常快 10%-15%)。
- 适用场景:单线程环境下需要高频字符串操作(如循环拼接 SQL)。
总结与使用场景
| 特性 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 可变性 | ❌ 不可变 | ✔️ 可变 | ✔️ 可变 |
| 线程安全 | ✔️(天然安全) | ✔️(同步锁) | ❌ 非线程安全 |
| 性能 | 修改操作慢 | 中等(同步开销) | 最高(无同步) |
| 适用场景 | 静态字符串 | 多线程字符串操作 | 单线程字符串操作 |