1. String、StringBuilder 与 StringBuffer 概述
String:字符串常量,长度不可变,因此不能被继承。
StringBuffer:字符串变量,线程安全(Synchronized)。适用于频繁修改字符串内容的场景。调用 toString() 可转换为 String 类型。主要操作包括 append 和 insert 方法,支持重载以接受任意类型数据。append 将字符追加至缓冲区末端,insert 在指定位置插入字符。
StringBuilder:字符串变量,非线程安全。内部实现为可变字符序列,JDK 5.0 新增。提供与 StringBuffer 兼容的 API,但不保证同步。设计用于单线程使用的字符串缓冲区场景。
2. 主要性能区别
执行速度比较:StringBuilder > StringBuffer > String。
StringBuffer 的 append 效率高于 String 的 "+" 连接操作。String 是不可变对象,每次修改都会生成新对象并改变引用,频繁修改会导致系统性能下降及 JVM GC 压力增加。StringBuffer 则直接操作对象本身。
在某些情况下,Java 编译器会将 String 对象的拼接优化为 StringBuffer 操作,此时两者速度差异不大。例如:
String s1 = "This is only a" + " simple" + " test";
StringBuilder sb = new StringBuilder("This is only a").append(" simple").append(" test");
上述生成 String s1 对象的速度并不比 StringBuilder 慢。实际上 Java 编译器会自动进行如下转换:
String s1 = "This is only a simple test";
3. 使用建议
- StringBuilder 通常用于方法内部完成类似 "+" 的功能,因线程不安全,用完后可丢弃。
- StringBuffer 主要用于全局变量。
- 为提高性能,构造 StringBuffer 或 StringBuilder 时应尽可能指定容量。若操作字符串长度不超过 16 个字符可不指定,默认容量为 16。不指定容量会显著降低性能。
- 相同情况下,StringBuilder 相比 StringBuffer 仅能获得 10%~15% 的性能提升,但需承担多线程不安全风险。在模块化编程中,除非确定模块不会运行在多线程模式下且系统瓶颈确实在 StringBuffer 上,否则建议使用 StringBuffer。

