Java學(xué)習(xí)之StringBuilder類(lèi)功能詳解

字符串連接可以通過(guò)兩種方法實(shí)現(xiàn)身隐,其中一種是在Java中提供的一個(gè)StringBuilder類(lèi)(這個(gè)類(lèi)只在J2SE5及以上版本提供廷区,以前的版本使用StringBuffer類(lèi))。
字符串是Java程序中最常用的一種數(shù)據(jù)結(jié)構(gòu)之一贾铝。在Java中的String類(lèi)已經(jīng)重載的"+"隙轻。也就是說(shuō),字符串可以直接使用"+"進(jìn)行連接垢揩,如下面代碼所示:

String s = "abc" + "ddd";

但這樣做真的好嗎玖绿?當(dāng)然,這個(gè)問(wèn)題不能簡(jiǎn)單地回答yes or no叁巨。要根據(jù)具體情況來(lái)定斑匪。在Java中提供了一個(gè)StringBuilder類(lèi)(這個(gè)類(lèi)只在J2SE5及以上版本提供,以前的版本使用StringBuffer類(lèi))锋勺,這個(gè)類(lèi)也可以起到"+"的作用蚀瘸。那么我們應(yīng)該用哪個(gè)呢?

下面讓我們先看看如下的代碼:

public class TestSimplePlus    
{  
    public static void main(String[] args)  
    {  
        String s = "abc";  
        String ss = "ok" + s + "xyz" + 5;  
        System.out.println(ss);   
    }  
}   

上面的代碼將會(huì)輸出正確的結(jié)果庶橱。從表面上看贮勃,對(duì)字符串和整型使用"+"號(hào)并沒(méi)有什么區(qū)別,但事實(shí)真的如此嗎悬包?下面讓我們來(lái)看看這段代碼的本質(zhì)衙猪。
我們首先使用反編譯工具(如jdk帶的javap、或jad)將TestSimplePlus反編譯成Java Byte Code,其中的奧秘就一目了然了垫释。
通過(guò)反編譯得出的結(jié)果是:雖然在源程序中使用了"+"丝格,但在編譯時(shí)仍然將"+"轉(zhuǎn)換成StringBuilder。因此棵譬,我們可以得出結(jié)論显蝌,在Java中無(wú)論使用何種方式進(jìn)行字符串連接,實(shí)際上都使用的是StringBuilder類(lèi)订咸。
那么是不是可以根據(jù)這個(gè)結(jié)論推出使用"+"和StringBuilder類(lèi)的效果是一樣的呢曼尊?這個(gè)要從兩個(gè)方面的解釋。如果從運(yùn)行結(jié)果來(lái)解釋?zhuān)敲?+"和StringBuilder是完全等效的脏嚷。但如果從運(yùn)行效率和資源消耗方面看骆撇,那它們將存在很大的區(qū)別。

當(dāng)然父叙,如果連接字符串行表達(dá)式很簡(jiǎn)單(如上面的順序結(jié)構(gòu))神郊,那么"+"和StringBuilder類(lèi)基本是一樣的,但如果結(jié)構(gòu)比較復(fù)雜趾唱,如使用循環(huán)來(lái)連接字符串涌乳,那么產(chǎn)生的Java Byte Code(java字節(jié)碼)就會(huì)有很大的區(qū)別。先讓我們看看如下的代碼:

public class TestStringBuilder  
{  
    public static void main(String[] args)  
    {  
        String s = "";  
        Random rand = new Random();  
        for (int i = 0; i <  10; i++)  
        {  
            result.append("a");  
            result.append(" ");  
        }  
        System.out.println(result.toString());  
    }  
}   

上面的代碼返編譯后可知甜癞,雖然編譯器將"+"轉(zhuǎn)換成了StringBuilder類(lèi)夕晓,但創(chuàng)建StringBuilder對(duì)象的位置卻在for語(yǔ)句內(nèi)部。這就意味著每執(zhí)行一次循環(huán)悠咱,就會(huì)創(chuàng)建一個(gè)StringBuilder對(duì)象(對(duì)于本例來(lái)說(shuō)蒸辆,是創(chuàng)建了10個(gè)StringBuilder對(duì)象),雖然Java有垃圾回收器乔煞,但這個(gè)回收器的工作時(shí)間是不定的吁朦。如果不斷產(chǎn)生這樣的垃圾,那么仍然會(huì)占用大量的資源渡贾。解決這個(gè)問(wèn)題的方法就是在程序中直接使用StringBuilder類(lèi)來(lái)連接字符串逗宜,代碼如下:

public class TestStringBuilder  
{  
    public static void main(String[] args)  
    {  
        StringBuilder result = new StringBuilder();  
        for (int i = 0; i <  10; i++)  
        {  
            result.append("a");  
            result.append(" ");  
        }  
        System.out.println(result.toString());  
    }  
}  

創(chuàng)建StringBuilder的代碼被放在了for語(yǔ)句外。雖然這樣處理在源程序中看起來(lái)復(fù)雜空骚,但卻換來(lái)了更高的效率纺讲,同時(shí)消耗的資源也更少了。
在使用StringBuilder類(lèi)時(shí)要注意囤屹,盡量不要"+"和StringBuilder混著用熬甚,否則會(huì)創(chuàng)建更多的StringBuilder對(duì)象,如下面代碼所:

for (int i = 0; i <  10; i++)  
{  
    result.append(rand.nextInt(1000));  
    result.append(" ");  
}  

改成:

for (int i=0;i<10;i++)  
{  
 result.append(rand.nextIne(1000) + "")  
}  

如果將上面的代碼在JDK1.4下編譯肋坚,必須將StringBuilder改為StringBuffer乡括,而JDK1.4將"+"轉(zhuǎn)換為StringBuffer(因?yàn)镴DK1.4并沒(méi)有提供StringBuilder類(lèi))肃廓。StringBuffer和StringBuilder的功能基本一樣,只是StringBuffer是線程安全的诲泌,而StringBuilder不是線程安全的盲赊。因此,StringBuilder的效率會(huì)更高敷扫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哀蘑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子葵第,更是在濱河造成了極大的恐慌绘迁,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卒密,死亡現(xiàn)場(chǎng)離奇詭異缀台,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)栅受,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)将硝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)恭朗,“玉大人屏镊,你說(shuō)我怎么就攤上這事√等” “怎么了而芥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)膀值。 經(jīng)常有香客問(wèn)我棍丐,道長(zhǎng),這世上最難降的妖魔是什么沧踏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任歌逢,我火速辦了婚禮,結(jié)果婚禮上翘狱,老公的妹妹穿的比我還像新娘秘案。我一直安慰自己,他們只是感情好潦匈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布阱高。 她就那樣靜靜地躺著,像睡著了一般茬缩。 火紅的嫁衣襯著肌膚如雪赤惊。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天凰锡,我揣著相機(jī)與錄音未舟,去河邊找鬼圈暗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裕膀,可吹牛的內(nèi)容都是我干的厂置。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼魂角,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昵济!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起野揪,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤访忿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后斯稳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體海铆,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年挣惰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卧斟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憎茂,死狀恐怖珍语,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竖幔,我是刑警寧澤板乙,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站拳氢,受9級(jí)特大地震影響募逞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜馋评,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一放接、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧留特,春花似錦纠脾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至市咆,卻和暖如春汉操,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒙兰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工磷瘤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芒篷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驮瞧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钓猬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法吹零,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法镰烧,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,597評(píng)論 18 399
  • (一)Java部分 1、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,079評(píng)論 0 62
  • 一楞陷、String 類(lèi) 1怔鳖、定義: 1、從概念上講固蛾,java字符串就是Unicode字符序列结执。每個(gè)用雙引號(hào)括起來(lái)的字...
    玉圣閱讀 1,562評(píng)論 0 1
  • 題圖是技術(shù)含量最高的樂(lè)高積木之一献幔,一套玩具里面居然有好幾個(gè)博士,一位演員览芳,和一個(gè)碩士(這是咋混進(jìn)來(lái)的)斜姥。 某乎這兩...
    頂級(jí)程序員閱讀 1,253評(píng)論 1 2
  • 史上第一混亂鄰居 文/劉漢皇 我的鄰居 應(yīng)該是史上最混亂的 沒(méi)有之一 909住著 秦王政和荊軻 最頭疼的是被秦王政...
    劉漢皇閱讀 800評(píng)論 1 26