摘要:使用命令行將包含了這行代碼的類反編譯查看其字節(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
摘要:我下圖代碼第五行和第九行分別定義了一個(gè)整型變量和一個(gè)整型常量程序員都知道兩者的區(qū)別。下面我們就用將文件反編譯出來然后深入研究里整型變量和整型常量的區(qū)別。 我下圖代碼第五行和第九行分別定義了一個(gè)整型變量和一個(gè)整型常量: static final int number1 = 512; static int number3 = 545; Java程序員都知道兩者的區(qū)別。 showImg(ht...
摘要:反匯編器與反編譯器不同,反編譯器的目標(biāo)是高級(jí)語言而非匯編語言。反匯編器的反匯編輸出通常格式化為適合人類閱讀,而非用作匯編器的輸入源,因此它主要是一個(gè)逆向工程工具。本文章參考了通過命令分析匯編指令反匯編器 問題描述 寫這篇文章是為了記錄我這幾天遇到的一個(gè)疑惑,并且順藤摸瓜的學(xué)習(xí)一下javap命令。遇到的疑惑是這樣的:我在看使用枚舉類型實(shí)現(xiàn)單列模式的博客時(shí),發(fā)現(xiàn)一些博客中寫到的枚舉類型的反...
摘要:從字節(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); 這篇文章使用下面這段簡單...
摘要:但是有一個(gè)的指令,可以把字節(jié)碼翻譯成人類能看懂的東西。是文件分解器,可以反編譯即對(duì)編譯的文件進(jìn)行反編譯,也可以查看編譯器生成的字節(jié)碼?,F(xiàn)在有一個(gè)類,定義入下先用編譯成字節(jié)碼,再使用進(jìn)行反編譯。 概要 Java工程師面試官偏愛的問題之一,就是abc和 new String(abc)的區(qū)別是什么?回答的比較好的會(huì)帶出Java堆,棧,常量池,引用等概念。但今天不止如此,我們從指令的角度,去看...
每篇一句 胡適:多談些問題,少聊些主義 前言 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%的必須,...
閱讀 2377·2021-11-22 14:56
閱讀 1183·2019-08-30 15:55
閱讀 3215·2019-08-29 13:29
閱讀 1366·2019-08-26 13:56
閱讀 3511·2019-08-26 13:37
閱讀 568·2019-08-26 13:33
閱讀 3356·2019-08-26 13:33
閱讀 2237·2019-08-26 13:33