外观
一句话答案
String 不可变每次拼接创建新对象,StringBuilder 可变非线程安全(推荐),StringBuffer 可变线程安全(synchronized)。
核心要点
| 类 | 可变 | 线程安全 | 性能 |
|---|---|---|---|
| String | 不可变 | 安全(不可变) | 拼接慢(创建新对象) |
| StringBuilder | 可变 | 不安全 | 快(推荐) |
| StringBuffer | 可变 | 安全(synchronized) | 较慢 |
追问与易错
追问方向:
- String 拼接底层怎么实现的?(JDK8 用 StringBuilder,JDK9+ 用 invokedynamic + StringConcatFactory)
- StringBuilder 初始容量是多少?(16,扩容为旧容量*2+2)
- 什么场景下 String 拼接性能也可以?(编译期优化常量折叠)
易错点:
- ❌ "循环中用 + 拼接没问题"——每次循环创建新 StringBuilder,应在循环外创建
- ❌ "StringBuffer 比 StringBuilder 安全所以优先用"——大部分场景不需要线程安全
💡 记忆锚点
String是石碑刻字(不可变,每次改都刻新碑),StringBuilder是白板写字(可变、快、单人用),StringBuffer是加了锁的白板(可变、稍慢、多人用)。循环拼接别用石碑,用白板。