String倒谷、StringBuffer和StringBuilder的區(qū)別

今天很大家來聊一下這個(gè)基礎(chǔ)的問題

說他們?nèi)咧g的區(qū)別我總結(jié)為一下三點(diǎn):

1.String長度不可變而StringBuffer和SringBuilder長度可變

2.他們的運(yùn)行速度不同 :SringBuilder > StringBuffer > String

3.SringBuilder 線程不安全 和 StringBuffer線程安全

下面我來一個(gè)一個(gè)解釋:

一.String長度不可變而StringBuffer和SringBuilder長度可變

廢話不多說,先上源碼糙箍!

如果你可以打開三個(gè)類的源碼看一下你就明白了

String.png
StringBuffer.png
StringBuilder.png
AbstractStringBuilder.png

我們能看到渤愁,String這個(gè)類底層使用了final修飾的長度不可變的字符數(shù)組,所以它長度不可變

private final char value[];

而StringBuffer和StringBuilder 都繼承自AbstractStringBuilder 深夯,且AbstractStringBuilder底層使用的是可變字符數(shù)組抖格,所以二者長度可變。

char[] value;

二.他們的運(yùn)行速度不同 :SringBuilder > StringBuffer > String

先來看這樣一段代碼

public class MainTest {
    public static void main(String[] args) {
        String  str = "abc";
        System.out.println(str);
        str = str + "cd";
        System.out.println(str);
    }
}

輸出結(jié)果為:

abc

abcd

? 整個(gè)程序運(yùn)行完我們看似是str這個(gè)對象被更改了塌西,在后面加上了一段新的字符他挎,但這只是假象,因?yàn)槲覀儎偛耪f過String類型的字符串長度是不可變的啊捡需,其實(shí)JVM是先創(chuàng)建的了一個(gè)str對象办桨,將“abc”賦值給str,然后在內(nèi)存中又創(chuàng)建了第二個(gè)str對象站辉,將第一個(gè)str對象中的“abc”與”de“相加再賦值給第二個(gè)str對象呢撞,此時(shí)Java虛擬機(jī)的垃圾回收機(jī)制開始其工作將第一個(gè)str對象回收损姜。所以說String類型的字符串要完成這樣”改變長度“的操作需要不斷地創(chuàng)建再回收,創(chuàng)建再回收殊霞,無形中經(jīng)過了很多步驟摧阅,而 StringBuffer和SringBuilder數(shù)組可變,直接可進(jìn)行更改绷蹲,所以要更快棒卷。

而SringBuilder 為什么比 StringBuffer 要快呢?

先來看源碼:

BuilderAppend.png
BufferAppend.png

? 從圖中可以看出StringBuffer的append的方法都被toStringCache關(guān)鍵字修飾了(不止圖中這兩個(gè)append方法包括StringBuffer源碼中所有append重載方法都被toStringCache修飾了祝钢。)

toStringCache關(guān)鍵字是給線程加鎖比规,枷鎖是會帶來性能上的損耗的,故用SringBuilder 比 StringBuffer 要快

鎖不懂先沒關(guān)系拦英,往下看蜒什!暫且理解為什么快。

三.SringBuilder 線程不安全 和 StringBuffer線程安全

? 線程安全不同的問題要和剛才的的思路連起來疤估,正是因?yàn)橛辛藅oStringCache關(guān)鍵字修飾StringBuffer的append方法有灾常,給線程加了鎖加了鎖所以線程安全。

? 這樣理解铃拇,如果一個(gè)StringBuffer對象的字符串在字符串緩沖區(qū)被多個(gè)線程同時(shí)使用時(shí)钞瀑,也就是多個(gè)線程同時(shí)操作,這樣會有出現(xiàn)錯(cuò)誤操作的概率锚贱,為了保證線程的安全性仔戈,進(jìn)行加鎖,這樣會使同一時(shí)間只有一個(gè)線程獲得權(quán)限拧廊,其他線程必須等待該線程結(jié)束并釋放鎖才能獲得權(quán)限监徘,這樣線程非常安全,雖然效率慢了點(diǎn)吧碾,但是當(dāng)項(xiàng)目安全性要求很高時(shí)就必須用StringBuffer凰盔。單一線程下還是的用更快一點(diǎn)的SringBuilder 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倦春,一起剝皮案震驚了整個(gè)濱河市户敬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睁本,老刑警劉巖尿庐,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呢堰,居然都是意外死亡抄瑟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門枉疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皮假,“玉大人鞋拟,你說我怎么就攤上這事∪亲剩” “怎么了贺纲?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長褪测。 經(jīng)常有香客問我猴誊,道長,這世上最難降的妖魔是什么汰扭? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任稠肘,我火速辦了婚禮福铅,結(jié)果婚禮上萝毛,老公的妹妹穿的比我還像新娘。我一直安慰自己滑黔,他們只是感情好笆包,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著略荡,像睡著了一般庵佣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汛兜,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天巴粪,我揣著相機(jī)與錄音,去河邊找鬼粥谬。 笑死肛根,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漏策。 我是一名探鬼主播派哲,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掺喻!你這毒婦竟也來了芭届?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤感耙,失蹤者是張志新(化名)和其女友劉穎褂乍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體即硼,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逃片,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谦絮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片题诵。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洁仗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出性锭,到底是詐尸還是另有隱情赠潦,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布草冈,位于F島的核電站她奥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怎棱。R本人自食惡果不足惜哩俭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拳恋。 院中可真熱鬧凡资,春花似錦、人聲如沸谬运。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梆暖。三九已至伞访,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轰驳,已是汗流浹背厚掷。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留级解,地道東北人冒黑。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像蠕趁,于是被迫代替她去往敵國和親薛闪。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 四俺陋、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列豁延,叫字符串。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 756評論 0 2
  • 第十天 權(quán)限修飾符 public protected default private 同一類 true true ...
    炙冰閱讀 539評論 0 1
  • 昨天是蝸牛向上爬的第一天腊状,雖有決心诱咏,卻不盡人意。 賓館的空調(diào)冷的要死缴挖,旁邊熟睡的隊(duì)友加上自身的懶散袋狞,讓我一次又一次...
    要奮斗的蝸牛閱讀 165評論 0 0
  • 從去年8月份,開始知道冥想這個(gè)概念,到10月3號正式開始冥想苟鸯,至今已經(jīng)九個(gè)多月了同蜻。 由剛開始的,每天半小時(shí)早处,到后來...
    超級賦能王張勝萍閱讀 1,709評論 7 6
  • 0 反思 代碼質(zhì)量永遠(yuǎn)是繞不過去的一個(gè)坎湾蔓,如今公司人員擴(kuò)招,更多進(jìn)來的是初級工程師砌梆,慢慢意識到一個(gè)嚴(yán)重的問題默责,質(zhì)量...
    __XY__閱讀 400評論 0 0