StringBuilder性能優(yōu)化

String字符串拼接性能優(yōu)化?博客中我已經(jīng)介紹過了String "+" 拼接背后的StringBuilder實(shí)現(xiàn)洲胖。也聊到了StringJoiner、Joiner等類庫都是通過StringBuilder實(shí)現(xiàn)的拼接铃芦。

那么今天我們來聊一聊StringBuilder還有什么點(diǎn)比較好玩。

StringBuilder的使用上吹缔,應(yīng)該來說性能問題取決于擴(kuò)容操作是否頻繁咳蔚,還有char數(shù)組是否浪費(fèi)豪嚎,所以一般來說大家都聽過要預(yù)估一個(gè)StringBuilder的容量去構(gòu)造。那除此之外谈火,StringBuilder還有哪些空間可以讓我們搞一些優(yōu)化呢侈询?

在介紹優(yōu)化方式之前,需要一點(diǎn)基礎(chǔ)知識(shí)糯耍,我們看一段代碼


如上扔字,在StringBuilder對(duì)象重新設(shè)置length屬性之后,之前append的值沒有了温技。

然后我charAt發(fā)現(xiàn)char[]第一位變成了4革为,且不允許訪問第二位。

然后我們來看一下幾個(gè)方法的源碼




如上舵鳞,我們可以知道StringBuilder底層是一個(gè)char數(shù)組震檩,然后count代表的是append char字節(jié)的次數(shù),注意這里不是append的次數(shù)蜓堕,而是string拆成了char之后的length恳蹲。

然后toString就是操作一個(gè)new String(char[],0,count),跟JSON toJSONString那塊源碼一樣俩滥。

那么setLength其實(shí)就是重新賦值了count值嘉蕾,然后append操作又是從數(shù)組0位操作的。

所以在setLength為0之后霜旧,再append值抽诉,char[]就會(huì)從0位開始替換原來的值浪慌,可以debug驗(yàn)證一下。


如上圖,append("1","2","3")之后setLength為0宣蔚,之后append("4"),就會(huì)變成4失尖,2较剃,3組成的char[]。

最后輸出toString自然只會(huì)偏移count值的char出來个绍,那么就只會(huì)輸出4勒葱,而char[]復(fù)用了。


說到這里巴柿,是不是已經(jīng)有靈感了凛虽?

沒錯(cuò),我們對(duì)StringBuilder優(yōu)化的思路就在于復(fù)用char[]广恢。

那么第一版我們能想到的方案就是一個(gè)靜態(tài)單例工具類做法凯旋,如下:

這樣我就可以不用創(chuàng)建多個(gè)StringBuilder,只需要reset就能復(fù)用char[]且忽略之前append的值,這會(huì)讓我們節(jié)省char[]創(chuàng)建和擴(kuò)容的時(shí)間&空間成本至非。

這個(gè)版本基本上夠用了钠署,但是線程不安全,那么線程安全版本的如下:



這個(gè)版本最初的實(shí)現(xiàn)在哪里呢荒椭?BigDecimal源碼谐鼎、Netty源碼

所以沒事看看jdk源碼還是很重要的~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市戳杀,隨后出現(xiàn)的幾起案子该面,更是在濱河造成了極大的恐慌,老刑警劉巖信卡,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隔缀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡傍菇,警方通過查閱死者的電腦和手機(jī)猾瘸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丢习,“玉大人牵触,你說我怎么就攤上這事「赖停” “怎么了揽思?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長见擦。 經(jīng)常有香客問我钉汗,道長,這世上最難降的妖魔是什么鲤屡? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任损痰,我火速辦了婚禮,結(jié)果婚禮上酒来,老公的妹妹穿的比我還像新娘卢未。我一直安慰自己,他們只是感情好堰汉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布辽社。 她就那樣靜靜地躺著,像睡著了一般衡奥。 火紅的嫁衣襯著肌膚如雪爹袁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天矮固,我揣著相機(jī)與錄音,去河邊找鬼。 笑死档址,一個(gè)胖子當(dāng)著我的面吹牛盹兢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播守伸,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绎秒,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了尼摹?” 一聲冷哼從身側(cè)響起见芹,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蠢涝,沒想到半個(gè)月后玄呛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡和二,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年徘铝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惯吕。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惕它,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出废登,到底是詐尸還是另有隱情淹魄,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布堡距,位于F島的核電站甲锡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吏颖。R本人自食惡果不足惜搔体,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望半醉。 院中可真熱鬧疚俱,春花似錦、人聲如沸缩多。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衬吆。三九已至梁钾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逊抡,已是汗流浹背姆泻。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工零酪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拇勃。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓四苇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親方咆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子月腋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355