剖析String、StringBuffer與StringBuilder底層區(qū)別(面試簡潔篇)
問題源頭
這個(gè)問題說實(shí)話,我是被公司老板反問過的,吃過虧的。所以專門研究了一下并且分享給不懂這塊知識點(diǎn)的人
代碼底層
如下圖所示,簡單介紹一下
String是一個(gè)變量,它是不可變的
StringBuilder,StringBuffer是可變的
StringBuilder是線程不安全的,也就是說它的代碼底層實(shí)現(xiàn)就是每個(gè)函數(shù)都沒有加 synchronized,這就導(dǎo)致了線程不安全,反而效率更快
StringBuffer是線程安全的,也就是說它的代碼底層實(shí)現(xiàn)久是每個(gè)函數(shù)都加了synchronized,這就導(dǎo)致了效率比較慢的原因
上面提到了可變的與不可變的,不懂的話應(yīng)該抽象不出來具體的效果,我畫個(gè)圖一看便知。

string 數(shù)據(jù)+=流程
string+=的流程是這樣的,它不會在后面直接添加一個(gè)字符串,而是通過新開辟一個(gè)字符串的形式,然后把第一個(gè) 第二個(gè)拼湊在一起,然后把地址引用調(diào)換到最終的字符串結(jié)果地址。
對于小項(xiàng)目操作來說的確沒啥多大區(qū)別,一旦上了規(guī)模的項(xiàng)目,如果還是這樣寫的話這就導(dǎo)致了,循環(huán)拼接的話導(dǎo)致大量的新建無用的變量對象,浪費(fèi)內(nèi)存空間,很容易OOM
StringBuilder,StringBuffer 數(shù)據(jù)+=就是在后面直接追加了,不會再創(chuàng)建變量了
總結(jié)應(yīng)用
簡單來說,
首選效率用StringBuilder,
首先安全用StringBuffer ,
多并發(fā)情況下首選StringBuffer,
單線程操作下首選StringBuilder,
至于sting在比較多的SQL拼接或者循環(huán)拼接中是不建議使用的!
還有一點(diǎn)比較重要的話,StringBuilder,StringBuffer 經(jīng)過編輯器編譯之后你會發(fā)現(xiàn)最后都會是一個(gè)string字符串,首選前面兩個(gè)只是減少內(nèi)存的無用創(chuàng)建
