JVM處理String對象使用”+”連接字符串的方式

String對象是不可變的,本文通過String的拼接翻譯成的字節(jié)碼,查看具體的原理,并且和顯示的使用StringBuilder進行拼接生成的字節(jié)碼進行對比,總結(jié)基本的使用原則。

String對象是不可變的,對一個String進行處理,無論是進行追加,轉(zhuǎn)換大小寫之類的,都會生成一個新的字符串。同時不可變性會帶來一定的效率問題。下面通過一個追加字符串的字節(jié)碼來了解下

Stringwho="arthinking";Stringstr1="what"+"is"+who+"?";System.out.println(str1);

編譯成字節(jié)碼,查看下具體的執(zhí)行流程 。進入編譯生成的Class所在目錄,執(zhí)行 javap -c StringTest,得到如下的JVM字節(jié)碼:

其中的dup和invokevirtural相當(dāng)于Java虛擬機上的匯編語言,編譯器自動引入了java.lang.StringBuilder類。從紅色的框框標識可以看到,編譯器創(chuàng)建了一個StringBuilder對象,用于構(gòu)造最終的String,并為每個字符串調(diào)用一次StringBuilder的append()方法,最后調(diào)用了toString()生成結(jié)構(gòu),并使用astore_2命令存為s。

明確的使用StringBuilder對象能夠避免產(chǎn)生過多的StringBuilder對象

在循環(huán)里使用+隱式的拼接字符串

publicStringimplicit(String[]fields){Stringresult="";for(inti=0;i

在循環(huán)里顯示的使用StringBuilder的append方法拼接字符串

publicStringexplicit(String[]fields){StringBuilderresult=newStringBuilder();for(inti=0;i

同樣,進入編譯生成的Class所在目錄,執(zhí)行 javap -c StringTest,得到JVM字節(jié)碼,下面是implicit方法的:

從第8行到第35行構(gòu)成了一個循環(huán)體可以看出,StringBuilder是在循環(huán)體內(nèi)構(gòu)造的,這意味著每經(jīng)過一次循環(huán),就會創(chuàng)建一個新的StringBuilder對象 。

下面是explicit方法的:

可以看到,這里只生成了一個StringBuilder對象,還可以為StringBuilder對象預(yù)先為其指定大小,如果已經(jīng)知道最終的字符串大概有多長,這樣可以避免多次給StringBuilder重新分配緩沖。

總結(jié):

當(dāng)為一個類編寫toString()方法時,如果字符串操作比較簡單,可以信賴編譯器,它會合理的為你構(gòu)造最終的字符串結(jié)果,如果要在toString()方法中使用循環(huán),最好自己創(chuàng)建一個StringBuilder對象。執(zhí)行例如 append(a + ":" + b),編譯器會掉入陷阱,從而另外創(chuàng)建一個StringBuilder對象處理括號內(nèi)的字符串操作。

原文 :?http://www.itzhai.com/difference-immutable-string-objects-using-stringbuffer-using-connection-string-handling-of-the-jvm.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • ??需要說明的一點是,這篇文章是以《深入理解Java虛擬機》第二版這本書為基礎(chǔ)的,這里假設(shè)大家已經(jīng)了解了JVM的運...
    Geeks_Liu閱讀 14,287評論 5 44
  • Tip:筆者馬上畢業(yè)了,準備開始 Java 的進階學(xué)習(xí)計劃。于是打算先從 String 類的源碼分析入手,作為后面...
    石先閱讀 12,109評論 16 58
  • iOS Universal Links(通用鏈接) 1.構(gòu)建通用鏈接 2.上傳通用鏈接 3.配置Xcode 4測試...
    Apel0811閱讀 950評論 0 0
  • 在這個被喧囂與浮躁淹沒的時代,絕大多數(shù)人都沒有力氣,也沒有勇氣去堅持自己。害怕被孤立,不想被排擠,所以總是人云亦云...
    逆風(fēng)飛翔的風(fēng)箏閱讀 1,681評論 0 4

友情鏈接更多精彩內(nèi)容