最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析反編譯字節(jié)碼文件中的代碼邏輯JVM中的String操作

 更新時間:2023年10月11日 10:05:20   作者:恐龍不畫畫  
這篇文章主要介紹了深入解析反編譯字節(jié)碼文件中的代碼邏輯JVM中的String操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

主要內容

以java程序代碼為起點講解在JVM層面上,搞清楚程序String操作的反編譯字節(jié)碼文件后,都發(fā)生了什么。

StringTable

String s1 = "a";
String s2 = "b";
String s3 = "a" + "b";
String s4 = s1 + s2;
String s5 = "ab";
String s6 = s4.intern();
// 問
System.out.println(s3 == s4);
System.out.println(s3 == s5);
System.out.println(s3 == s6);
String x2 = new String("c") + new String("d");
String x1 = "cd";
x2.intern();
// 問,如果調換了【最后兩行代碼】的位置呢,如果是jdk1.6呢
System.out.println(x1 == x2);

輸出結果:flase true true flase

至于為什么前先明白StringTable的特性:

  • 在JDK1.6以前,StringTable在方法區(qū)和堆空間分離,采用永久代的形式實現(xiàn),而在JDK1.8及以后,方法區(qū)是由采用本地內存,以元空間的形式實現(xiàn),而此時StringTable被遷移到了堆空間中(內存更加大了)。

  • StringTable里面的字符串只有在被第一次使用時才會變成對象,沒被使用依舊是符號。
  • 利用串池的機制,來避免重復創(chuàng)建字符串對象
  • 字符串變量拼接的原理是 StringBuilder (1.8)
  • 字符串常量拼接的原理是編譯期優(yōu)化
  • 可以使用 intern 方法,主動將串池中還沒有的字符串對象放入串池

    • 1.8 將這個字符串對象嘗試放入串池,如果有則并不會放入,如果沒有則放入串池, 會把串池中的對象返回
    • 1.6 將這個字符串對象嘗試放入串池,如果有則并不會放入,如果沒有會把此對象復制一份,放入串池, 會把串池中的對象返回

javap -v 反編譯字節(jié)碼內部處理邏輯

下面我將利用javap -v 反編譯該字節(jié)碼,得到代碼內部處理邏輯。

依次解釋:

==就是比較兩個引用的內存地址是否相同。

第一個false:

s3在編譯期間就優(yōu)化成了字符串常量"ab",在StringTable中,而s4則調用了StringBuilder中的append方法,是s1,s2都是new出來的,最后相當 StringBulder s=new StringBulder();然后s.append("a").append("b");
然后把s的引用給了s4,所以s4是在堆的其他地方,不在常量池中。所以false。

第二個true:

正如前面所說,編譯器在編譯階段就已經(jīng)將"a"+"b"優(yōu)化成了"ab"(語法糖)因為"a","b"都是常量,所以沒有問題。所以說s3和s5內存地址相等,都在常量池里面。

第三個true:

因為StringTable特性,s4調用intern方法準備將自己的字符串入池,而此時發(fā)現(xiàn)池中有"ab",s4在入池前就有了,所以s4入池失敗,但是返回的還是是池中的引用對象地址。ps:如果此時池中沒有"ab",那么s4可以入池成功,并且自己的地址也變成了常量池中對應的串地址(jdk1.8以后才行)

第四個false:

與前面3類似,在x2入池前,常量池中已經(jīng)有了"cd",所以入池失敗,自己還是原來的地址(堆的其他位置),與常量池地址不同。所以按照注釋:如果【調換最后兩行代碼】,則入池成功,x2也變成了池中的地址此時為true(jdk1.8以后才行),如果是jdk1.6及以前,是采用復制一個對象,比如x3然后入池,x2還是沒有改變地址。

以上就是深入解析反編譯字節(jié)碼文件中的代碼邏輯JVM中的String操作的詳細內容,更多關于JVM中 String操作反編譯字節(jié)碼的資料請關注腳本之家其它相關文章!

相關文章

  • Java編寫日歷表的3種方式

    Java編寫日歷表的3種方式

    這篇文章主要為大家詳細介紹了Java編寫日歷表的3種方式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 淺談SpringBoot 中關于自定義異常處理的套路

    淺談SpringBoot 中關于自定義異常處理的套路

    這篇文章主要介紹了淺談SpringBoot 中關于自定義異常處理的套路,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Java面向程序的三大特性之封裝、繼承、多態(tài)詳解(最新整理)

    Java面向程序的三大特性之封裝、繼承、多態(tài)詳解(最新整理)

    面向對象程序三大特性:封裝、繼承、多態(tài),而類和對象階段,主要研究的就是封裝特性,何為封裝呢?簡單來說就是套殼屏蔽細節(jié),本文給大家介紹Java面向程序的三大特性之封裝、繼承、多態(tài),感興趣的朋友一起看看吧
    2025-06-06
  • SpringBoot實現(xiàn)多種來源的Zip多層目錄打包下載

    SpringBoot實現(xiàn)多種來源的Zip多層目錄打包下載

    這篇文章主要為大家詳細介紹了SpringBoot如何實現(xiàn)多種來源的?Zip?多層目錄打包下載,包括本地文件和HTTP混合,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-04-04
  • Springboot非分布式定時任務實現(xiàn)代碼

    Springboot非分布式定時任務實現(xiàn)代碼

    這篇文章主要介紹了Springboot非分布式定時任務實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Springboot+Poi導入Excel表格實現(xiàn)過程詳解

    Springboot+Poi導入Excel表格實現(xiàn)過程詳解

    這篇文章主要介紹了Springboot+Poi導入Excel表格實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Java實現(xiàn)將容器 Map中的內容保存到數(shù)組

    Java實現(xiàn)將容器 Map中的內容保存到數(shù)組

    這篇文章主要介紹了Java實現(xiàn)將容器 Map中的內容保存到數(shù)組,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spring Data JPA 復雜/多條件組合分頁查詢

    Spring Data JPA 復雜/多條件組合分頁查詢

    本文主要介紹了Spring Data JPA 復雜/多條件組合分頁查詢的相關資料。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Java數(shù)組的運用詳解

    Java數(shù)組的運用詳解

    這篇文章主要給大家介紹了關于Java中數(shù)組的定義和使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • 在eclipse中使用SVN的方法(圖文)

    在eclipse中使用SVN的方法(圖文)

    這篇文章主要介紹了在eclipse中使用SVN的方法(圖文),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08

最新評論

巴林右旗| 吴川市| 佛教| 襄垣县| 胶南市| 漾濞| 南漳县| 阜康市| 卢氏县| 大宁县| 水富县| 闸北区| 北宁市| 锡林郭勒盟| 沂水县| 伊金霍洛旗| 南木林县| 东海县| 朔州市| 旬阳县| 太仆寺旗| 山阴县| 溆浦县| 襄垣县| 潼南县| 襄城县| 新河县| 元朗区| 英德市| 灵璧县| 庄浪县| 谷城县| 榆中县| 萝北县| 麦盖提县| 聂拉木县| 溧阳市| 玉屏| 利津县| 麻阳| 泰安市|