这三个类是 Java 中处理字符串的“三剑客”,面试中必考。
简单来说,它们的区别主要体现在 可变性 (Mutability)、线程安全 (Thread Safety) 和 性能 (Performance) 上。
特性 | String | StringBuilder | StringBuffer |
|---|---|---|---|
可变性 | 不可变 (Immutable) | 可变 (Mutable) | 可变 (Mutable) |
线程安全 | 线程安全 (因为不可变) | 非线程安全 | 线程安全 (Synchronized) |
性能 | 修改时最慢 (要创建新对象) | 最快 | 较快 (有锁的开销) |
推荐场景 | 字符串常量、少量拼接 | 单线程大量拼接 (最常用) | 多线程并发修改字符串 |
String s = "Hello"; s = s + " World"; 时,Java 并没有在原字符串上修改,而是:
s 指向这个新对象。
sb.append("a") 是直接在容器内部追加字符,不会创建新对象。
synchronized 关键字(线程锁)。这意味着同一时间只能有一个线程操作它。
❌ 错误写法 (String):
String s = ""; // 这种写法效率极低!每次循环都 new 一个新对象
for (int i = 0; i < 10000; i++) {
s = s + i;
}✅ 正确写法 (StringBuilder):
StringBuilder sb = new StringBuilder(); // 这种写法效率极高,只在一个对象上操作
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
String res = sb.toString();