源码
String
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[]; ...
StringBuffer
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence { @Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; } ...
StringBuilder
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence { @Override public StringBuilder append(String str) { super.append(str); return this; } ...
AbstractStringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value;
分析对比
创建对象方面
- String 类中使⽤ final 关键字修饰字符数组来保存字符串,private final char value[] ,所以 String 对象是不可变的。在每次增加的时候都会创建新的对象。
- StringBuilder 与 StringBuffer 都继承⾃ AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使⽤字符数组保存字符串 char[]value 但是没有⽤ final 关键字修饰,所以这两种对象都是可变的。
线程安全方面
StringBuffer 对⽅法加了同步锁或者对调⽤的⽅法加了同步锁,所以是线程安全的。 StringBuilder 并没有对⽅法进⾏加同步锁,所以是⾮线程安全的。
synchronized关键字
使用场景
- 操作少量的数据: 适⽤ String
- 单线程操作字符串缓冲区下操作⼤量数据: 适⽤ StringBuilder
- 多线程操作字符串缓冲区下操作⼤量数据: 适⽤ StringBuffer