摘要:使用命令行將包含了這行代碼的類反編譯查看其字節(jié)碼我們看到字符串被編譯器加到了常量池里。代碼被翻譯成了下面兩句字節(jié)碼首先底層的原生方法被調(diào)用,生成的內(nèi)部存儲實現(xiàn)。做一個字符串拼接的操作。
我們看這樣一行簡單的字符串賦值操作的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)部存儲實現(xiàn)char[]。然后執(zhí)行l(wèi)dc #16, 將常量池內(nèi)的代號為#16的常量加載到棧上,即i042416。
2. astore_1:將"i042416"的引用存儲到序號為1的本地變量中(即我們代碼中的局部變量a)。
下面再看一個稍微復雜一點的例子。
做一個字符串拼接的操作。
String aa1 = "i042416";
String aa2 = "jerrywang";
String aa3 = "i042416" + "jerrywang";
可以看到,在編譯階段,編譯器字節(jié)把兩個字符串常量的值進行拼接,結(jié)果"i042416jerrywang"存儲到變量aa3中, 作為一個新的字符串常量, 在常量池中代號為#21。
因此,變量aa1和aa3實際上指向常量池中的同一個常量,因此直接用==比較也返回true。
String aa1 = "i042416jerrywang";
String aa2 = "jerrywang";
String aa3 = "i042416" + "jerrywang";
System.out.println(aa1 == aa3);
要獲取更多Jerry的原創(chuàng)技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/71811.html
摘要:我下圖代碼第五行和第九行分別定義了一個整型變量和一個整型常量程序員都知道兩者的區(qū)別。下面我們就用將文件反編譯出來然后深入研究里整型變量和整型常量的區(qū)別。 我下圖代碼第五行和第九行分別定義了一個整型變量和一個整型常量: static final int number1 = 512; static int number3 = 545; Java程序員都知道兩者的區(qū)別。 showImg(ht...
摘要:反匯編器與反編譯器不同,反編譯器的目標是高級語言而非匯編語言。反匯編器的反匯編輸出通常格式化為適合人類閱讀,而非用作匯編器的輸入源,因此它主要是一個逆向工程工具。本文章參考了通過命令分析匯編指令反匯編器 問題描述 寫這篇文章是為了記錄我這幾天遇到的一個疑惑,并且順藤摸瓜的學習一下javap命令。遇到的疑惑是這樣的:我在看使用枚舉類型實現(xiàn)單列模式的博客時,發(fā)現(xiàn)一些博客中寫到的枚舉類型的反...
摘要:從字節(jié)碼的分析可以觀察到一個有趣的現(xiàn)象,再次看看我們的語句。這張表里每行的后面的數(shù)字代表源代碼的序號,冒號后面的數(shù)字代表字節(jié)碼里每行指令的序號。維護了源代碼同字節(jié)指令的映射關系,確保了代碼調(diào)試的順利進行。 javap是JDK自帶的工具: showImg(https://segmentfault.com/img/remote/1460000016730237); 這篇文章使用下面這段簡單...
摘要:但是有一個的指令,可以把字節(jié)碼翻譯成人類能看懂的東西。是文件分解器,可以反編譯即對編譯的文件進行反編譯,也可以查看編譯器生成的字節(jié)碼?,F(xiàn)在有一個類,定義入下先用編譯成字節(jié)碼,再使用進行反編譯。 概要 Java工程師面試官偏愛的問題之一,就是abc和 new String(abc)的區(qū)別是什么?回答的比較好的會帶出Java堆,棧,常量池,引用等概念。但今天不止如此,我們從指令的角度,去看...
每篇一句 胡適:多談些問題,少聊些主義 前言 Spring MVC和MyBatis作為當下最為流行的兩個框架,大家平時開發(fā)中都在用。如果你往深了一步去思考,你應該會有這樣的疑問: 在使用Spring MVC的時候,你即使不使用注解,只要參數(shù)名和請求參數(shù)的key對應上了,就能自動完成數(shù)值的封裝 在使用MyBatis(接口模式)時,接口方法向xml里的SQL語句傳參時,必須(當然不是100%的必須,...
閱讀 2444·2021-11-22 14:56
閱讀 1243·2019-08-30 15:55
閱讀 3270·2019-08-29 13:29
閱讀 1433·2019-08-26 13:56
閱讀 3647·2019-08-26 13:37
閱讀 620·2019-08-26 13:33
閱讀 3411·2019-08-26 13:33
閱讀 2300·2019-08-26 13:33