你必須搞清楚的String,StringBuilder篱瞎,StringBuffer

String,StringBuilder 以及 StringBuffer 這三個(gè)類的關(guān)系與區(qū)別一直是 Java 的經(jīng)典問題,這次就來講一下關(guān)于這三個(gè)類的一些知識

一. 簡單對比

  • String : 字符常量
  • StringBuilder : 字符變量
  • StringBuffer : 字符變量

String 屬于常量類型痒芝,被聲明為 final class俐筋,所有的屬性也都是 final 類型,因此 String 對象一旦創(chuàng)建严衬,便不可更改澄者;
StringBuilder / StringBuffer 兩個(gè)類屬于變量類型,是可以更改的请琳,它們都是為了解決字符串由于拼接產(chǎn)生太多中間對象的問題而提供的類粱挡。

  • 運(yùn)行速度 StringBuilder > StringBuffer > String
  • 線程安全: StringBuffer
  • 非線程安全 : StringBuilder

StringBuilder 在本質(zhì)上和 StringBuffer 沒有太大區(qū)別,但是由于 StringBuilder 去掉了 StringBuffer 擁有的線程安全部分单起,因此有效減少了開銷抱怔。因此,StringBuilder 是大部分情況下字符串拼接操作的首選

二. String 處理字符串

例一:

String s = "abcd";
s = s + "fgh";

很多人作這樣的字符串處理的時(shí)候會誤認(rèn)為 String 類型是可變的嘀倒。

但其實(shí) JVM 處理這段代碼的過程是這樣的:首先創(chuàng)建 s 對象,賦值“abcd” ,然后處理第二行代碼時(shí)测蘑,再創(chuàng)建一個(gè) s 對象灌危,賦值 “abcdfgh”,然后將第一個(gè) s 對象垃圾回收碳胳。

所以相當(dāng)于第一個(gè) s 沒更改過勇蝙,第二個(gè) s 是新的對象

例二:

String str = “This is only a” + “simple” + “test”;

這段代碼相當(dāng)于 String str = “This is only a simple test”;

例三:

String str2 = "This is only a";
String str3 = "simple";
String str4 = "test";
String str1 = str2 +str3 + str4;

這段代碼同樣會按照例一的過程來處理

三. StringBuilder / StringBuffer 構(gòu)造特性

這兩個(gè)對象在構(gòu)造的過程中,首先按照默認(rèn)大小申請一個(gè)字符數(shù)組(char[])挨约, 默認(rèn)容量為 16 個(gè)字符味混,但如果超出,會使用 Arrays.copyOf() 成倍擴(kuò)容 16诫惭,32翁锡,64, 128...,當(dāng)然這樣會影響性能夕土,因此可以在創(chuàng)建對象時(shí)按照需要自定義其容量

源代碼:
//默認(rèn) 16 個(gè)字符
public StringBuilder() {
    super(16);
}
//構(gòu)造函數(shù)定義容量
public StringBuilder(int capacity) {
    super(capacity);
}

四. String 與 StringBuilder 處理字符串拼接對比

我們都知道馆衔,進(jìn)行字符串拼接操作時(shí)推薦使用 StringBuilder,但是是不是什么時(shí)候都推薦使用 StringBuilder 來代替 String 進(jìn)行字符串拼接怨绣?顯然不是的角溃。

例一:

String str = "123";
String str1 = str + "456";
String str2 = new StringBuilder().append(str).append("def").toString();

在這種情況下,兩種處理方式效率差別不大

JDK1.5 之后篮撑, String 的字符串拼接操作會被編譯器自動轉(zhuǎn)換為 StringBuilder 并調(diào)用 append 方法减细,最后調(diào)用 StringBuilder 的 toString 方法返回一個(gè)重新創(chuàng)建的字符串,由于這樣的優(yōu)化方案赢笨,使得兩個(gè)類在這種情況下的處理效率差別不大邪财;而在 Java 9 中,為了更加統(tǒng)一字符串操作優(yōu)化质欲,提供了 StringConcatFactory树埠,作為一個(gè)統(tǒng)一的入口,更加優(yōu)化了字符串拼接操作嘶伟。

例二:

String str = "";
for (int i = 0; i < 1000; i++) {
    str += "12345";
}

StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    stringBuilder.append("12345");
}

這種情況下怎憋,StringBuilder 更快

在循環(huán)中,每執(zhí)行一次 “+”九昧,都會創(chuàng)建一個(gè) String 對象绊袋,因此會有大量對象創(chuàng)建和回收的消耗。

簡單來說铸鹰,在循環(huán)中對同一個(gè)字符串對象做字符串拼接癌别,優(yōu)先選擇 StringBuilder

例三

String str1 = "123" + "456" + "789";

String str2 = new StringBuilder("123").append("456").append("789").toString();

這種情況下,String 更快

我們都知道 String str1 = "123" + "456" + "789"; 其實(shí)是等同于 String str1 = "123456789";的蹋笼,而 StringBuilder 反而需要多次調(diào)用 append 方法展姐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躁垛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子圾笨,更是在濱河造成了極大的恐慌教馆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擂达,死亡現(xiàn)場離奇詭異土铺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)板鬓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門悲敷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俭令,你說我怎么就攤上這事后德。” “怎么了唤蔗?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵探遵,是天一觀的道長。 經(jīng)常有香客問我妓柜,道長箱季,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任棍掐,我火速辦了婚禮藏雏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘作煌。我一直安慰自己掘殴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布粟誓。 她就那樣靜靜地躺著奏寨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹰服。 梳的紋絲不亂的頭發(fā)上病瞳,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音悲酷,去河邊找鬼套菜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛设易,可吹牛的內(nèi)容都是我干的逗柴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼顿肺,長吁一口氣:“原來是場噩夢啊……” “哼戏溺!你這毒婦竟也來了渣蜗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤于购,失蹤者是張志新(化名)和其女友劉穎袍睡,沒想到半個(gè)月后知染,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肋僧,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年控淡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嫌吠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掺炭,死狀恐怖辫诅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涧狮,我是刑警寧澤炕矮,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站者冤,受9級特大地震影響肤视,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涉枫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一邢滑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愿汰,春花似錦困后、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吗跋,卻和暖如春侧戴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背小腊。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工救鲤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秩冈。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓本缠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親入问。 傳聞我的和親對象是個(gè)殘疾皇子丹锹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

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

  • 前言 最先接觸編程的知識是在大學(xué)里面楣黍,大學(xué)里面學(xué)了一些基礎(chǔ)的知識匾灶,c語言,java語言租漂,單片機(jī)的匯編語言等阶女;大學(xué)畢...
    oceanfive閱讀 3,088評論 0 7
  • 前言 RTFSC (Read the fucking source code )才是生活中最重要的。我們天天就是要...
    二毛_coder閱讀 455評論 1 1
  • String類 字符串廣泛應(yīng)用在java編程中憔杨,String類在java.lang包中,String類是final...
    ThreeGold閱讀 875評論 2 3
  • 我想成為一個(gè)意志品質(zhì)堅(jiān)定蒜胖,對自己想要的事物熱情努力追求消别,堅(jiān)強(qiáng)執(zhí)著的人
    愛你的石頭閱讀 215評論 0 0
  • RAC中用于處理事件的類,可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞台谢,包裝到這個(gè)類中寻狂,他可以很方便的監(jiān)控事件的執(zhí)行過...
    csp閱讀 216評論 0 0