三者都是用來對字符串進行操做,String一般用來定義一個變量,而StringBuilder StringBuffer則一般用來對字符串進行拼接等操做。但其實String一樣的能夠用來拼接字符串,可咱們爲何不多使用呢,這樣從三者的底層代碼提及。數組
String的底層代碼爲一個用final修飾的char數組,這意味着定義一個String變量之後,該變量的內容是不可變的。安全
StringBuilder 與StringBuffer都繼承自AbstractStringBuilder,該類的char數組並無用final修飾,內容是可變的,這個是什麼意思呢。jvm
好比:ui
String s1= "a";spa
String s2 = new String("b") ;3d
String s3 = s1+s2;對象
若是這樣,咱們獲得「ab」這個字符串,由於String底層未不可變的字符串,因此會建立三個對象,都會佔用內存,而這三個對象一直都未失去引用,因此jvm沒法垃圾回收,形成內存資源的大量浪費,這在咱們開發中是不推崇的,而StringBuilder 與StringBuffer則不存在這樣的問題。blog
經過底層代碼咱們能夠看到StringBuilder 與StringBuffer在拼接字符串時,經過判斷字符串長度是否足夠,從而建立一個新的數組用來封裝數據,而原來的對象被放棄引用,等待垃圾回收,從而減小內存的浪費,所以在拼接字符串等操做時,咱們一般使用StringBuilder 與StringBuffer,但二者在執行效率上又有不一樣,StringBuilder的執行效率較高,這是爲何呢?繼承
經過底層源碼,能夠發現StringBuffer在拼接字符串時,使用了同步鎖,安全性提升,而StringBuilder未使用同步鎖,故效率提升。內存