在面試學習中有遇到過有提問,String,StringBuild,StringBuffer的區別,從網上搜索了一下資料有所了解之后在這里整理總結了一下,便於大家觀看,加強自己在學子知識點鍾的記憶,如有誤或者可以補充的,還請大家多多指教和補充:
1,首先說說運行速度,或者執行速度,三者的速度快慢大概為:StringBuild>StringBuffer> String .
String 最常見,但最慢的原因:
String是字符串的常量,StringBuild和StringBuffer是字符串變量,String一旦創建就不可更改,新的String其實是新的常量,String只能被創建不能被修改,StringBuild和StringBuffer是可更改的,下面以代為為例:
1 String str="abc"; 2 Sys.out.println(str); 3 str=str+"de"; 4 sys.out.println(str);
運行這段代碼會先輸出abc,在輸出abcde,看起來這個str對象的值被改變了,其實是假象,第二個是創建了新的對象,兩個對象不一樣, 在jvm中代碼是這樣處理的,首先創建一個String對象str並把abc賦值給str,然后在第三行代碼中,jvm其實又創建了一個新的對象也叫str,並把原來的str的值賦值和“de”賦值給新的str,而原來的str會被垃圾回收機制(GC)給回收掉了,所以str並沒有被修改,也就是String一旦被創建后就不可更改,所以,Java中對String對象進行的操作實際上是一個不斷地創建新的對象並且將舊的對象回收的過程,所以實行速度很慢。
而StringBuild和StringBuffer的對象是變量,對變量進行操作就是直接對該對象進行更改,而不驚醒創建和回收操作,所以速度要比String快很多。
另外有時候我們會這樣對字符串進行賦值
1 String str="abc"+"de"; 2 Stringbuilder stringBuilder=new StringBuilder().append("abc")+append("de"); 3 Sys.out.println(str); 4 Sys.out.println(stringBuilder);
這樣輸出結果同樣是“abcde”和“abcde”,但是String的速度比StringBuild的執行速度快得多,因為第一行中的操作和String str="abcde";是完全一樣,第一行只是一次創建對象並賦值, 而第二行是一次創建並且多次更改值,而如果寫成下面這種形式
1 String str1="abc"; 2 String str2="de"; 3 String str=str1+str2; 4 Sys.out.println(str);
那么jvm就像上面所說的那樣,不斷的創建對象,回收對象來進行這個操作了,速度就會很慢。
2,再來說線程安全
在線程上,StringBuilder是線程不安全的,StringBuffer是線程安全的
如果一個StringBuffer對象在字符串緩沖區被多個線程使用時,StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證線程是安全的,但StringBuild的方法沒有關鍵字,所以不能保證線程安全,有可能會出現一些錯誤的操作。所以如果要進行的操作時多線程,那么就要用StringBuffer,但是在單線程的情況下,還是建議適用速度比較快的StringBuild。
3,總結一下
String:適用於少量的字符串操作的情況,即創建復制后,修改的比較少的情況
StringBuffer:適用於單線程下字符串緩沖區進行大量操作的情況
StringBuilder:適用於多線程下字符串緩沖區進行大量操作的情況
