第五章、String找岖,StringBuilder陨倡,StringBuffer三者的區(qū)別

String:適用于少量的字符串操作的情況

StringBuilder:適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況

StringBuffer:適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況


字符串廣泛應(yīng)用 在Java 編程中,在 Java 中字符串屬于许布,Java 提供了?String 類來創(chuàng)建操作字符串兴革。

需要注意的是,String的值是不可變的蜜唾,這就導(dǎo)致每次對String的操作都會生成新的String對象杂曲,這樣不僅效率低下,而且大量浪費有限的內(nèi)存空間袁余。

當(dāng)對字符串進(jìn)行修改的時候擎勘,需要使用 StringBuffer 和 StringBuilder 類。

和 String 類不同的是颖榜,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改棚饵,并且不產(chǎn)生新的未使用對象。


StringBuilder 類在 Java 5 中被提出掩完,它和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的(不能同步訪問)噪漾。

由于 StringBuilder 相較于 StringBuffer 有速度優(yōu)勢,所以多數(shù)情況下建議使用 StringBuilder 類且蓬。然而在應(yīng)用程序要求線程安全的情況下欣硼,則必須使用 StringBuffer 類。



繼承結(jié)構(gòu)關(guān)系



擴(kuò)展

1恶阴、String

(1)String的創(chuàng)建原理

????由于String在Java世界中使用過于頻繁诈胜,Java為了避免在一個系統(tǒng)中產(chǎn)生大量的String對象,引入了字符串常量池冯事。其運行機(jī)制是:創(chuàng)建一個字符串時耘斩,首先檢查池中是否有值相同的字符串對象,如果有則不需要創(chuàng)建直接從池中剛查找到的對象引用桅咆;如果沒有則新建字符串對象括授,返回對象引用,并且將新創(chuàng)建的對象放入池中。但是荚虚,通過new方法創(chuàng)建的String對象是不檢查字符串池的薛夜,而是直接在堆區(qū)或棧區(qū)創(chuàng)建一個新的對象,也不會把對象放入池中版述。上述原則只適用于通過直接量給String對象引用賦值的情況梯澜。

舉例:String str1 = "123"; //通過直接量賦值方式,放入字符串常量池

String str2 = new String(“123”);//通過new方式賦值方式渴析,不放入字符串常量池

注意:String提供了inter()方法晚伙。調(diào)用該方法時,如果常量池中包括了一個等于此String對象的字符串(由equals方法確定)俭茧,則返回池中的字符串咆疗。否則,將此String對象添加到池中母债,并且返回此池中對象的引用午磁。

(2) String的特性

不可變。是指String對象一旦生成毡们,則不能再對它進(jìn)行改變迅皇。不可變的主要作用在于當(dāng)一個對象需要被多線程共享,并且訪問頻繁時衙熔,可以省略同步和鎖等待的時間登颓,從而大幅度提高系統(tǒng)性能。不可變模式是一個可以提高多線程程序的性能红氯,降低多線程程序復(fù)雜度的設(shè)計模式挺据。

針對常量池的優(yōu)化。當(dāng)2個String對象擁有相同的值時脖隶,他們只引用常量池中的同一個拷貝扁耐。當(dāng)同一個字符串反復(fù)出現(xiàn)時,這個技術(shù)可以大幅度節(jié)省內(nèi)存空間产阱。


2 StringBuffer/StringBuilder

StringBuffer和StringBuilder都實現(xiàn)了AbstractStringBuilder抽象類婉称,擁有幾乎一致對外提供的調(diào)用接口;其底層在內(nèi)存中的存儲方式與String相同构蹬,都是以一個有序的字符序列(char類型的數(shù)組)進(jìn)行存儲王暗,不同點是StringBuffer/StringBuilder對象的值是可以改變的,并且值改變以后庄敛,對象引用不會發(fā)生改變;兩者對象在構(gòu)造過程中俗壹,首先按照默認(rèn)大小申請一個字符數(shù)組,由于會不斷加入新數(shù)據(jù)藻烤,當(dāng)超過默認(rèn)大小后绷雏,會創(chuàng)建一個更大的數(shù)組头滔,并將原先的數(shù)組內(nèi)容復(fù)制過來,再丟棄舊的數(shù)組涎显。因此坤检,對于較大對象的擴(kuò)容會涉及大量的內(nèi)存復(fù)制操作,如果能夠預(yù)先評估大小期吓,可提升性能早歇。

唯一需要注意的是:StringBuffer是線程安全的,但是StringBuilder是線程不安全的讨勤〖可參看Java標(biāo)準(zhǔn)類庫的源代碼,StringBuffer類中方法定義前面都會有synchronize關(guān)鍵字潭千。為此谱姓,StringBuffer的性能要遠(yuǎn)低于StringBuilder。


3 應(yīng)用場景

[A]在字符串內(nèi)容不經(jīng)常發(fā)生變化的業(yè)務(wù)場景優(yōu)先使用String類脊岳。例如:常量聲明、少量的字符串拼接操作等垛玻。如果有大量的字符串內(nèi)容拼接割捅,避免使用String與String之間的“+”操作,因為這樣會產(chǎn)生大量無用的中間對象帚桩,耗費空間且執(zhí)行效率低下(新建對象亿驾、回收對象花費大量時間)。

[B]在頻繁進(jìn)行字符串的運算(如拼接账嚎、替換莫瞬、刪除等),并且運行在多線程環(huán)境下郭蕉,建議使用StringBuffer疼邀,例如XML解析、HTTP參數(shù)解析與封裝召锈。

[C]在頻繁進(jìn)行字符串的運算(如拼接旁振、替換、刪除等)涨岁,并且運行在單線程環(huán)境下拐袜,建議使用StringBuilder,例如SQL語句拼裝梢薪、JSON封裝等蹬铺。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秉撇,隨后出現(xiàn)的幾起案子甜攀,更是在濱河造成了極大的恐慌秋泄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赴邻,死亡現(xiàn)場離奇詭異印衔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)姥敛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門奸焙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人彤敛,你說我怎么就攤上這事与帆。” “怎么了墨榄?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵玄糟,是天一觀的道長。 經(jīng)常有香客問我袄秩,道長阵翎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任之剧,我火速辦了婚禮郭卫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘背稼。我一直安慰自己贰军,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布蟹肘。 她就那樣靜靜地躺著词疼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帘腹。 梳的紋絲不亂的頭發(fā)上贰盗,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音阳欲,去河邊找鬼童太。 笑死,一個胖子當(dāng)著我的面吹牛胸完,可吹牛的內(nèi)容都是我干的书释。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼赊窥,長吁一口氣:“原來是場噩夢啊……” “哼爆惧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锨能,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤扯再,失蹤者是張志新(化名)和其女友劉穎芍耘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熄阻,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡斋竞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秃殉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坝初。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钾军,靈堂內(nèi)的尸體忽然破棺而出鳄袍,到底是詐尸還是另有隱情,我是刑警寧澤吏恭,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布拗小,位于F島的核電站,受9級特大地震影響樱哼,放射性物質(zhì)發(fā)生泄漏哀九。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一搅幅、第九天 我趴在偏房一處隱蔽的房頂上張望阅束。 院中可真熱鬧,春花似錦盏筐、人聲如沸围俘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至簿寂,卻和暖如春漾抬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背常遂。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工纳令, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人克胳。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓平绩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親漠另。 傳聞我的和親對象是個殘疾皇子捏雌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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

  • String 的聲明 由 JDK 中關(guān)于String的聲明可以知道: 不同字符串可能共享同一個底層char數(shù)組,例...
    CodeKing2017閱讀 1,616評論 1 2
  • 前言 RTFSC (Read the fucking source code )才是生活中最重要的笆搓。我們天天就是要...
    二毛_coder閱讀 447評論 1 1
  • 可以看到的變化就是信息化不斷發(fā)展...
    Nice_cool閱讀 220評論 1 5
  • 雖休病假但心系團(tuán)隊性湿,任然關(guān)注著大家 每天一點點的積累回頭看看你們都甩我?guī)滋旖掷埠俸?只要努力 定不負(fù)我們的付出纬傲,你...
    劉斯宇閱讀 214評論 1 0
  • “女票,你下樓嘛” “干嘛” “我有東西給你” 生氣的第二天 晚上六點 天已黑盡全是寒氣 豆先生裹著大衣 帶著黑色...
    萍萍_sunshine閱讀 128評論 0 0