Java提供了String、StringBuffer和StringBuilder類來封裝字符串,並提供了一系列操做字符串對象的方法。java
它們的相同點是都用來封裝字符串;都實現了CharSequence接口。它們之間的區別以下:數組
1、可變與不可變安全
String類是一個不可變類,即建立String對象後,該對象中的字符串是不可改變的,直到這個對象被銷燬。StringBuffer與StringBuilder都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,是可變類。微信
因爲String是可變類,適合在須要被共享的場合中使用,當一個字符串常常被修改時,最好使用StringBuffer實現。若是用String保存一個常常被修改的字符串,該字符串每次修改時都會建立新的無用的對象,這些無用的對象會被垃圾回收器回收,會影響程序的性能,不建議這麼作。多線程
2、初始化方式app
當建立String對象時,能夠利用構造方法String str = new String("Java")的方式來對其進行初始化,也能夠直接用賦值的方式String s = "Java"來初始化。而StringBuffer只能使用構造方法StringBuffer sb = new StringBuffer("hello")的方式初始化。性能
3、字符串修改方式ui
String字符串修改方法是首先建立一個StringBuffer,其次調用StringBuffer的append方法,最後調用StringBuffer的toString()方法把結果返回,示例代碼以下:
String str = "hello";spa
str += "java";線程
以上代碼等價於下面的代碼:
StringBuffer sb = new StringBuffer(str);
sb.append("java");
str = sb.toString();
上述String字符串的修改過程要比StringBuffer多一些額外操做,會增長一些臨時的對象,從而致使程序的執行效率下降。StringBuffer和StringBuilder在修改字符串方面比String的性能要高。
4、是否實現了equals和hashCode方法
String實現了equals()方法和hashCode()方法,new String("java").equals(new String("java"))的結果爲true;
而StringBuffer沒有實現equals()方法和hashCode()方法,所以,new StringBuffer("java").equals(new StringBuffer("java"))的結果爲false,將StringBuffer對象存儲進Java集合類中會出現問題。
5、是否線程安全
StringBuffer與StringBuilder都提供了一系列插入、追加、改變字符串裏的字符序列的方法,它們的用法基本相同,只是StringBuilder是線程不安全的,StringBuffer是線程安全的,。若是隻是在單線程中使用字符串緩衝區,則StringBuilder的效率會高些,可是當多線程訪問時,最好使用StringBuffer。
綜上,在執行效率方面,StringBuilder最高,StringBuffer次之,String最低,對於這種狀況,通常而言,若是要操做的數量比較小,應優先使用String類;若是是在單線程下操做大量數據,應優先使用StringBuilder類;若是是在多線程下操做大量數據,應優先使用StringBuffer類。
歡迎關注微信公衆號【Java典籍】,收看更多Java技術乾貨!
▼微信掃一掃下圖↓↓↓二維碼關注