java中String、StringBuffer、StringBuilder的区别

1.可变与不可变性

  String是不可变的,它是由字符数组来保存对象的值,并声明为final类型,所以String对象是不可变字符序列。

    private final char value[];

  StringBuffer和StringBuilder都是可变的字符序列,它们也是由字符数组保存。

    char value[];

 

2.线程是否安全

  String是final类型的,不可变的,所以肯定是线程安全的。

  StringBuffer中对方法增加了同步锁或调用的方法增加了同步锁,所以是线程安全的。源码如下:    

    public synchronized String substring(int start, int end) {
      return super.substring(start, end);
    }

    public synchronized StringBuffer append(String str) {
      super.append(str);
      return this;
    }

  StringBuilder中的方法没有实现同步锁功能,所以是非线程安全的。

 

3.StringBuffer和StringBuilder的相同点

  二者都继承了抽象类AbstractStringBuilder,都继承了定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

  抽象类与接口的唯一区别在于:抽象类定义了子类中的一些共用方法,子类中只需添加一些新的操作。接口中只是对常量的定义和方法的声明,子类实现必须实现接口中所有方法。

  如果只是单线程建议使用StringBuilder,它的效率高于StringBuffer。

  

 

posted @ 2015-07-13 10:39  博出未来  阅读(105)  评论(0编辑  收藏  举报