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;
    }

}

 

  

 

posted @ 2020-06-17 16:00  勤奋的土豆  阅读(19)  评论(0)    收藏  举报