String、StringBuilder 和 StringBuffer 的区别?

发布于

一、可变性不同

  • 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