String、StringBuilder 和 StringBuffer 的区别?
Java 基础面试题发布于
一、可变性不同
String是不可变类,内部用final修饰字符数组。对字符串做拼接实际上会创建新的 String 对象。StringBuilder与StringBuffer都继承自AbstractStringBuilder,内容可变,拼接时直接修改内部数组。
二、线程安全不同
String不可变,天然线程安全。StringBuffer的方法加了synchronized,是线程安全的。StringBuilder没有同步措施,线程不安全,但单线程下性能更好。
三、性能对比
大量字符串拼接时:
// 差:循环中产生大量临时对象
String s = "";
for (int i = 0; i < 1000; i++) {
s = s + i;
}
// 推荐:单线程使用 StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i);
}
四、选型建议
| 场景 | 推荐类型 |
|---|---|
| 少量字符串、不需要修改 | String |
| 单线程大量拼接(方法内局部变量最常见) | StringBuilder |
| 多线程共享、需要保证安全 | StringBuffer |