成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用javap分析Java的字符串操作

asce1885 / 667人閱讀

摘要:使用命令行將包含了這行代碼的類反編譯查看其字節(jié)碼我們看到字符串被編譯器加到了常量池里。代碼被翻譯成了下面兩句字節(jié)碼首先底層的原生方法被調(diào)用,生成的內(nèi)部存儲(chǔ)實(shí)現(xiàn)。做一個(gè)字符串拼接的操作。

我們看這樣一行簡單的字符串賦值操作的Java代碼。

String a = "i042416";

使用命令行將包含了這行代碼的Java類反編譯查看其字節(jié)碼:

javap -v constant.ConstantFolding

我們看到字符串 "i042416" 被Java編譯器加到了常量池里。

Java代碼 String a = "i042416"被翻譯成了下面兩句字節(jié)碼:

ldc #16: 首先JVM底層的原生方法StringTable::intern被調(diào)用,生成String的內(nèi)部存儲(chǔ)實(shí)現(xiàn)char[]。然后執(zhí)行l(wèi)dc #16, 將常量池內(nèi)的代號(hào)為#16的常量加載到棧上,即i042416。

2. astore_1:將"i042416"的引用存儲(chǔ)到序號(hào)為1的本地變量中(即我們代碼中的局部變量a)。

下面再看一個(gè)稍微復(fù)雜一點(diǎn)的例子。

做一個(gè)字符串拼接的操作。

String aa1 = "i042416";

String aa2 = "jerrywang";

String aa3 = "i042416" + "jerrywang";

可以看到,在編譯階段,編譯器字節(jié)把兩個(gè)字符串常量的值進(jìn)行拼接,結(jié)果"i042416jerrywang"存儲(chǔ)到變量aa3中, 作為一個(gè)新的字符串常量, 在常量池中代號(hào)為#21。

因此,變量aa1和aa3實(shí)際上指向常量池中的同一個(gè)常量,因此直接用==比較也返回true。

String aa1 = "i042416jerrywang";

String aa2 = "jerrywang";

String aa3 = "i042416" + "jerrywang";

System.out.println(aa1 == aa3);

要獲取更多Jerry的原創(chuàng)技術(shù)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙"或者掃描下面二維碼:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71811.html

相關(guān)文章

  • 使用javap深入理解Java整型常量和整型變量區(qū)別

    摘要:我下圖代碼第五行和第九行分別定義了一個(gè)整型變量和一個(gè)整型常量程序員都知道兩者的區(qū)別。下面我們就用將文件反編譯出來然后深入研究里整型變量和整型常量的區(qū)別。 我下圖代碼第五行和第九行分別定義了一個(gè)整型變量和一個(gè)整型常量: static final int number1 = 512; static int number3 = 545; Java程序員都知道兩者的區(qū)別。 showImg(ht...

    Mr_houzi 評(píng)論0 收藏0
  • javap命令與Java Dcompiler工具、IDEA自帶反編譯器反編譯結(jié)果差別及原因

    摘要:反匯編器與反編譯器不同,反編譯器的目標(biāo)是高級(jí)語言而非匯編語言。反匯編器的反匯編輸出通常格式化為適合人類閱讀,而非用作匯編器的輸入源,因此它主要是一個(gè)逆向工程工具。本文章參考了通過命令分析匯編指令反匯編器 問題描述 寫這篇文章是為了記錄我這幾天遇到的一個(gè)疑惑,并且順藤摸瓜的學(xué)習(xí)一下javap命令。遇到的疑惑是這樣的:我在看使用枚舉類型實(shí)現(xiàn)單列模式的博客時(shí),發(fā)現(xiàn)一些博客中寫到的枚舉類型的反...

    張憲坤 評(píng)論0 收藏0
  • 一個(gè)簡單例子教會(huì)您使用javap

    摘要:從字節(jié)碼的分析可以觀察到一個(gè)有趣的現(xiàn)象,再次看看我們的語句。這張表里每行的后面的數(shù)字代表源代碼的序號(hào),冒號(hào)后面的數(shù)字代表字節(jié)碼里每行指令的序號(hào)。維護(hù)了源代碼同字節(jié)指令的映射關(guān)系,確保了代碼調(diào)試的順利進(jìn)行。 javap是JDK自帶的工具: showImg(https://segmentfault.com/img/remote/1460000016730237); 這篇文章使用下面這段簡單...

    BLUE 評(píng)論0 收藏0
  • 從指令角度看"abc"和new String("abc")

    摘要:但是有一個(gè)的指令,可以把字節(jié)碼翻譯成人類能看懂的東西。是文件分解器,可以反編譯即對(duì)編譯的文件進(jìn)行反編譯,也可以查看編譯器生成的字節(jié)碼?,F(xiàn)在有一個(gè)類,定義入下先用編譯成字節(jié)碼,再使用進(jìn)行反編譯。 概要 Java工程師面試官偏愛的問題之一,就是abc和 new String(abc)的區(qū)別是什么?回答的比較好的會(huì)帶出Java堆,棧,常量池,引用等概念。但今天不止如此,我們從指令的角度,去看...

    doodlewind 評(píng)論0 收藏0
  • 為何Spring MVC可獲取到方法參數(shù)名,而MyBatis卻不行?【享學(xué)Spring MVC】

    每篇一句 胡適:多談些問題,少聊些主義 前言 Spring MVC和MyBatis作為當(dāng)下最為流行的兩個(gè)框架,大家平時(shí)開發(fā)中都在用。如果你往深了一步去思考,你應(yīng)該會(huì)有這樣的疑問: 在使用Spring MVC的時(shí)候,你即使不使用注解,只要參數(shù)名和請(qǐng)求參數(shù)的key對(duì)應(yīng)上了,就能自動(dòng)完成數(shù)值的封裝 在使用MyBatis(接口模式)時(shí),接口方法向xml里的SQL語句傳參時(shí),必須(當(dāng)然不是100%的必須,...

    孫淑建 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<