String StringBuilder StringBuffer的區別?

在Java開發面試經常會被問到String,StringBuider,StringBuffer區別,很多人回答得不夠全面和深入,那麼它們到底都有什麼區別呢!

三者都是用來對字符串進行操作,String通常用來定義一個變量,而StringBuilderStringBuffer則通常用來對字符串進行拼接等操作。但其實String同樣的可以用來拼接字符串,可我們為什麼很少使用呢,這樣從三者的底層代碼說起。

String StringBuilder StringBuffer的區別?

String的底層代碼為一個用final修飾的char數組,這意味著定義一個String變量以後,該變量的內容是不可變的。

String StringBuilder StringBuffer的區別?

String StringBuilder StringBuffer的區別?

String StringBuilder StringBuffer的區別?

StringBuilder 與StringBuffer都繼承自AbstractStringBuilder,該類的char數組並沒有用final修飾,內容是可變的,這個是什麼意思呢。

比如:

String s1= "a";

String s2 = new String("b") ;

String s3 = s1+s2;

如果這樣,我們得到“ab”這個字符串,因為String底層未不可變的字符串,所以會創建三個對象,都會佔用內存,而這三個對象一直都未失去引用,所以jvm無法垃圾回收,造成內存資源的大量浪費,這在我們開發中是不推崇的,而StringBuilder 與StringBuffer則不存在這樣的問題。

String StringBuilder StringBuffer的區別?

String StringBuilder StringBuffer的區別?

String StringBuilder StringBuffer的區別?

通過底層代碼我們可以看到StringBuilder 與StringBuffer在拼接字符串時,通過判斷字符串長度是否足夠,從而創建一個新的數組用來封裝數據,而原來的對象被放棄引用,等待垃圾回收,從而減少內存的浪費,因此在拼接字符串等操作時,我們通常使用StringBuilder 與StringBuffer,但兩者在執行效率上又有不同,StringBuilder的執行效率較高,這是為什麼呢?

String StringBuilder StringBuffer的區別?

String StringBuilder StringBuffer的區別?

通過底層源碼,可以發現StringBuffer在拼接字符串時,使用了同步鎖,安全性提高,而StringBuilder未使用同步鎖,故效率提高。

現在應該弄清楚他們三者之間的區別了吧!!更多技術乾貨,請關注源碼時代官網和官微。


分享到:


相關文章: