1. 程式人生 > >Java基礎之String,StringBuilder,StringBuffer三者的區別

Java基礎之String,StringBuilder,StringBuffer三者的區別

這個問題也是面試中很多人都回去問的。

這三個類之間的區別主要是在兩個方面,即執行速度和執行緒安全這兩方面。

String,StringBuilder,StringBuffer 執行速度

首先說執行速度,或者說是執行速度,在這方面執行速度快慢為:StringBuilder > StringBuffer > String

為什麼 String 最慢

  String最慢的原因:

String為字串常量,是final物件,而StringBuilder和StringBuffer均為字串變數,即String物件一旦建立之後該物件是不可更改的,但後兩者的物件是變數,是可以更改的。

舉個例子:

如果執行這段程式碼會發現先輸出“abc”,然後又輸出“abcde”,好像是str這個物件被更改了,其實,這只是一種假象罷了,JVM對於這幾行程式碼是這樣處理的,首先建立一個String物件str,並把“abc”賦值給str,然後在第三行中,其實JVM又建立了一個新的物件也名為str,然後再把原來的str的值和“de”加起來再賦值給新的str,而原來的str就會被JVM的垃圾回收機制(GC)給回收掉了,所以,str實際上並沒有被更改,也就是前面說的String物件一旦建立之後就不可更改了。所以,Java中對String物件進行的操作實際上是一個不斷建立新的物件並且將舊的物件回收的一個過程,所以執行速度很慢。

StringBuilder 和StringBuffer 的物件是變數

而StringBuilder和StringBuffer的物件是變數,對變數進行操作就是直接對該物件進行更改,而不進行建立和回收的操作,所以速度要比String快很多。

舉個例子:

這樣輸出結果也是“abcde”和“abcde”,但是String的速度卻比StringBuilder的反應速度要快很多,這是因為第1行中的操作和

  String str="abcde";

是完全一樣的,所以會很快,而如果寫成下面這種形式

  String str1="abc";

  String str2="de";

  String str=str1+str2;

那麼JVM就會像上面說的那樣,不斷的建立、回收物件來進行這個操作了。速度就會很慢。

執行速度(效率)總結

效率上來看,String 的拼接 要比 其它兩個更快(再定義一個常量的情況下),如果物件多了,java的垃圾自動回收機制會開始工作了,所以效率很低,建議在不斷更改String物件的地方不要使用String型別,但是對於開發中還需要考慮安全問題。

StringBuffer是個可變的物件,就是每次操作都是對物件本身進行操作,而不用生成新的物件,這樣效率就會有很大的提高,在大部分情況下StringBuffer的效率要比String型別更高。

StringBuilder與StringBuffer一樣是個可變的字元序列,提供與StringBuffer相容的API,但是不能保證同步。

String,StringBuilder,StringBuffer 執行緒安全

StringBuilder是執行緒不安全的,而StringBuffer是執行緒安全的

如果一個StringBuffer物件在字串緩衝區被多個執行緒使用時,StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證執行緒是安全的,但StringBuilder的方法則沒有該關鍵字,所以不能保證執行緒安全,有可能會出現一些錯誤的操作。所以如果要進行的操作是多執行緒的,那麼就要使用StringBuffer,但是在單執行緒的情況下,還是建議使用速度比較快的StringBuilder,因為StringBuilder沒有處理同步(Synchronized)問題。

執行緒問題(安全)總結

StringBuilder是執行緒不安全的,執行效率高,如果一個字串變數是在方法裡面定義,這種情況只可能有一個執行緒訪問他,不存在不安全的因素了,則用StringBuilder。如果要在類裡面定義成員變數,並且這個類的例項物件會在多執行緒環境下使用那麼最好用StringBuffer。

String:適用於少量的字串操作的情況

StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況

StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況