天天看點

Java String、StringBuilder和StringBuffer三者的差別

 老是忘記這三者的差別,這裡做個學習記錄,友善大家觀看,也友善自己記憶,内容是根據網上資料和自己的了解來記錄,如有不正确的地方,懇請指正

這三者最主要的差別有兩個方面:運作速度和線程安全

1、運作速度

運作速度或者說執行速度,運作速度的快慢為:StringBuilder > StringBuffer > String

String最慢的原因:

String為字元串常量,而StringBuilder和StringBuffer均為字元串變量,即String一旦建立之後,該對象是不可更改的,而StringBuilder和StringBuffer是變量,是可以更改的。下面以一段代碼為例:

如果運作這段代碼會發現:先輸出 abc 然後再輸出 abcde 。看起來好像 str 是被更改了,其實,這隻是一種假象而已,JVM對于這幾行代碼是這樣處理的:首先建立一個 String 對象 str ,并把 abc 指派給 str ,然後在第三行中,其實 JVM 又建立了一個新的對象也叫做 str ,然後把原來 str 的值和 de 加起來再指派給新的 str ,而原來的 str 會被 JVM 的垃圾回收機制(GC)給回收掉了,是以,str 其實并沒有被更改,也就是前面說的,String 對象一旦建立就不能夠更改。是以,java 中對 String 對象進行的操作實際上是一個不斷建立新的對象,并且将久的對象回收的一個過程,是以執行速度很慢。

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

另外,有時候我們會這樣對字元串進行指派:

這樣輸出的結果也是 abcde 和 abcde ,但是 String 的速度要比 StringBuilder 的反應速度快很多,這是因為第一行中的操作和 String str = "abcde"; 是完全一樣的,是以會很快,而如果寫成下面這種形式:

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

2、線程安全

線上程安全上:StringBuilder 是線程不安全的,StringBuffer 是線程安全的。

如果一個 StringBuffer 對象在字元串緩沖區被多個線程同時使用,StringBuffer 中很多方法可以帶有 synchronized 關鍵字,是以可以保證線程是安全的,但 StringBuilder 的方法則沒有該關鍵字,是以不能保證線程安全,有可能會出現一些錯誤的操作。是以,要進行的操作是多線程的,那麼就要使用 StringBuffer ,但是在單線程的情況下,建議使用速度比較快的 StringBuilder 。

3、三者的繼承結構圖

4、總結

String:适用于少量的字元串操作的情況 StringBuilder:适用于單線程下在字元緩沖區進行大量操作的情況 StringBuffer:适用多線程下在字元緩沖區進行大量操作的情況