String、StringBuffer、StringBuilder区别
主要区别:
(1) String在修改时不会改变对象本身 ,每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将在JVM栈中的对象引用指向堆中新的 String 对象,所以经常改变内容的字符串最好不要用 String 。
(2) StringBuilder和StringBuffer在修改时会改变对象自身 ,每次结果都会对 StringBuilder和StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuilder和StringBuffer,特别是字符串对象经常改变的情况下。主要使用的是 append 和 insert 方法。
(3)String与StringBuffer线程安全(多线程使用),StringBuilder非线程安全(单线程使用)。
(4)StringBuilder和StringBuffer都继承了AbstractStringBuilder类,除线程安全性不同外,其余的特性都是一样的。
(5)如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
(6)String可以空赋值,StringBuilder和StringBuffer后者不行。
源码解释:
String字符串常量,内容不可变,String对象存储在Constant String Pool(字符串常量池),在源码中插入的值被final修饰。
Java并发编程规则:不可变对象永远是线程安全的,所以String是线程安全的。
//String类部分源码
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
private final char value[];
public String() {
this.value = "".value;
}
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
}
StringBuffer中的append方法被synchronized修饰,所以是线程安全的。
//StringBuffer类部分源码
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence { public synchronized StringBuffer append(StringBuffer sb) { toStringCache = null; super.append(sb); return this; } /** * @since 1.8 */ @Override synchronized StringBuffer append(AbstractStringBuilder asb) { toStringCache = null; super.append(asb); return this; } }

浙公网安备 33010602011771号