String、StringBuffer與StringBuilder之間區別

最近過來公司面試的人比較多,其中有一道筆試題就是問String、StringBuffer與StringBuilder之間區別 。發現雖然大家在程序中做字符串處理時經常用到,但對他們的真正區別好像不是太清楚,回答也千奇百怪!這裏整理下它們三者之間的幾點區別,以及使用場景,以供大家參考!

執行速度
1.執行速度方面三者有如下關係:
StringBuilder>StringBuffer>String;

分析原因
1.String執行速度慢於StringBuilder與StringBuffer原因:

  • String 是字符常量;
  • StringBuilder 是字符變量;
  • StringBuffer 是字符變量;

從三者的源碼定義不難發現,String是字符常量,也就是說是final類型的,是不可改變的,這裏可能大家心裏會有疑問了,先來看下下面的代碼:

String ss = "dotest";
ss = ss + "addstr";

可能大家平時代碼裏經常這麼寫,問題來了,不是說String是字符常量嗎?不是不能修改它的值嗎?

其實是JVM的一種變相處理方式,可以看作是一種“欺騙”,對於上面兩行代碼JVM是這樣處理的,先創建一個常量ss,並對它進行賦值dotest,然後當執行ss=ss+”addstr”時,JVM會臨時再創建一個變量ss,併爲它賦值dotest+addstr,之前的ss會通過垃圾回站GC進行回收進而釋放內存。

而StringBuilder與StringBuffer則不同,它們是字符變量,對他們賦值,即是在同一個對象上進行操作,不存在GC回收,新對象創建等操作,現在可以理解爲什麼String爲什麼比StringBuilder與StringBuffer執行效率低了吧。

特殊的例子

String ss = "this is my"+"first"+"demo!";
StringBuffer buffer = new StringBuffer("this is my").append("first").append("demo!");

這個例子可以發現用ss生成很快,完全看不出用StringBuffer有什麼效率方面的優勢,其實瞭解下JVM對上面兩句話的執行方式就會明白原因:

String ss = "this is my"+"first"+"demo!";

實際上JVM會以 String ss = “this is my first demo!”;來執行。
如果換下面的寫法就能體現出速度差異了:

String ss = "this is my"; 
String dd = "first";
String ff = "demo!";
ss = ss + dd + ff;

這時JVM就會規規矩矩按上面分析到的方式進行處理。

StringBuffer與StringBuilder
StringBuffer 是線程安全的;
StringBuilder 是非線程一安全的;

當我們的字符緩衝區被多個線程使用時,JVM不能保證StringBuilder 操作是安全的,雖然速度是最快的,但是可以保證StringBuffer 的操作是安全的,不過大多情況下我們都是單線程在操作字符緩衝區,因此大多建議使用StringBuilder 的情況下就只是因爲速度的原因。

總結
對於以上三者的使用情況簡單總結如下:

  1. 如果少量的字符串操作採用String;
  2. 如果單線程下操作大量字符串採用StringBuilder ;
  3. 如果多線程下操作大量字符串採用StringBuffer ;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章