String、StringBuffer和StringBuilder類的區別


Java提供了String、StringBuffer和StringBuilder類來封裝字符串,並提供了一系列操作字符串對象的方法。

它們的相同點是都用來封裝字符串;都實現了CharSequence接口。它們之間的區別如下:

一、可變與不可變

String類是一個不可變類,即創建String對象后,該對象中的字符串是不可改變的,直到這個對象被銷毀。StringBuffer與StringBuilder都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,是可變類。

由於String是可變類,適合在需要被共享的場合中使用,當一個字符串經常被修改時,最好使用StringBuffer實現。如果用String保存一個經常被修改的字符串,該字符串每次修改時都會創建新的無用的對象,這些無用的對象會被垃圾回收器回收,會影響程序的性能,不建議這么做。

二、初始化方式

當創建String對象時,可以利用構造方法String str = new String("Java")的方式來對其進行初始化,也可以直接用賦值的方式String s = "Java"來初始化。而StringBuffer只能使用構造方法StringBuffer sb = new StringBuffer("hello")的方式初始化。

三、字符串修改方式

String字符串修改方法是首先創建一個StringBuffer,其次調用StringBuffer的append方法,最后調用StringBuffer的toString()方法把結果返回,示例代碼如下:
String str = "hello";

str += "java";

以上代碼等價於下面的代碼:

StringBuffer sb = new StringBuffer(str);

sb.append("java");

str = sb.toString();

上述String字符串的修改過程要比StringBuffer多一些額外操作,會增加一些臨時的對象,從而導致程序的執行效率降低。StringBuffer和StringBuilder在修改字符串方面比String的性能要高。

四、是否實現了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集合類中會出現問題。

五、是否線程安全

StringBuffer與StringBuilder都提供了一系列插入、追加、改變字符串里的字符序列的方法,它們的用法基本相同,只是StringBuilder是線程不安全的,StringBuffer是線程安全的,。如果只是在單線程中使用字符串緩沖區,則StringBuilder的效率會高些,但是當多線程訪問時,最好使用StringBuffer。

綜上,在執行效率方面,StringBuilder最高,StringBuffer次之,String最低,對於這種情況,一般而言,如果要操作的數量比較小,應優先使用String類;如果是在單線程下操作大量數據,應優先使用StringBuilder類;如果是在多線程下操作大量數據,應優先使用StringBuffer類。

 

歡迎關注微信公眾號【Java典籍】,收看更多Java技術干貨!

  ▼微信掃一掃下圖↓↓↓二維碼關注

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM