關於這三者的應用場景:
String:適用於少量的字符串操作的情況
StringBuilder:適用於單線程下在字符緩沖區進行大量操作的情況
StringBuffer:適用多線程下在字符緩沖區進行大量操作的情況
這三者場景不同,是由其多方面原因造成的。
1.運行的速度快慢:StringBuilder > StringBuffer > String
1.1 String最慢的原因:String為字符串常量,使用常量類型的字符數組保存值,其對象一旦創建,將不可更改。
String a="hello";
a=a+" world";
這樣的操作,貌似a變量被改變了,實際這只是一種假象,JVM對於這幾行代碼是這樣處理的:首先創建一個String對象a,並把“hello”賦值給a,然后JVM又創建了一個新的對象也名為a,把原來的a的值和“ world”加起來再賦值給新的a,而原來的a就會被JVM的垃圾回收機制(GC)給回收掉了,所以,a並沒有被更改,也就是前面說的String對象一旦創建之后就不可更改了。所以,Java中對String對象進行的操作實際上是一個不斷創建新的對象並且將舊的對象回收的一個過程,執行速度很慢。
1.2 而StringBuffer和StringBuilder都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,但沒有“final”修飾符,所以兩種對象都是可變的。這里沒有頻繁的創建和回收,速度會很快。
2.是否多線程安全
2.1 String為常量,所以線程安全;
2.2 StringBuffer對方法加了同步鎖(synchronized) ,所以是線程安全的;
2.3StringBuilder沒有加同步鎖,所以線程不安全。不能保證安全的情況,有可能會出現一些錯誤。(所以進行的操作是多線程的,那么就要使用StringBuffer,但是在單線程的情況下,還是建議使用速度比較快的StringBuilder。)