摘要:但是有一個的指令,可以把字節碼翻譯成人類能看懂的東西。是文件分解器,可以反編譯即對編譯的文件進行反編譯,也可以查看編譯器生成的字節碼。現在有一個類,定義入下先用編譯成字節碼,再使用進行反編譯。
概要
Java工程師面試官偏愛的問題之一,就是"abc"和 new String("abc")的區別是什么?回答的比較好的會帶出Java堆,棧,常量池,引用等概念。但今天不止如此,我們從指令的角度,去看這個問題。
正文我們知道,java類編譯后的字節碼是個二進制文件,不是給人而是給機器閱讀的。但是java有一個javap的指令,可以把字節碼翻譯成人類能看懂的東西。
javap是 Java class文件分解器,可以反編譯(即對javac編譯的文件進行反編譯),也可以查看java編譯器生成的字節碼。用于分解class文件。
現在有一個類,定義入下
public class A01 { public static void main(String ... args){ String a = "123"; String c = new String("123"); } }
先用javac A01.java編譯成字節碼,再使用javap -c A01.class進行反編譯。得到入下文本
Compiled from "A01.java" public class javap.A01 { public javap.A01(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(java.lang.String...); Code: 0: ldc #2 // String 123 2: astore_1 3: new #3 // class java/lang/String 6: dup 7: ldc #2 // String 123 9: invokespecial #4 // Method java/lang/String." ":(Ljava/lang/String;)V 12: astore_2 13: return }
我們主要看下面這段關于main方法的文本,里面涉及的指令不多,我整理了一下
ldc:將常亮加載到操作數棧
astore_1: 將棧頂元素的值保存到變量1
new: 為要創建的類實例開辟內存空間,并將地址壓入操作數棧
dup: 復制操作數棧頂值,并將其壓入棧頂
invokespecial:調用方法,例子中的方法是類的構造器
現在我們結合指令和操作數棧,來模擬一次計算
回到最開始的問題,a="123"和a=new String("123")的區別,前者指向的是常量池的地址,后者指向的是堆中新開辟的地址。這兩個 == 的結果,自然是不相等的。equals的結果呢?equals是字符逐個比較內容,是相等的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73834.html
摘要:當使用時,基本字符串和字符串對象也會產生不同結果,會將基本字符串作為源代碼處理,而字符串對象則被看作對象處理,返回對象。利用方法,我們可以將字符串對象轉換為其對應的基本字符串。 筆試的時候總會遇到string 和 new String相關的問題,匯總一下 var s1 = abc var s2 = String(abc) var s3 = new String(abc) var s4 ...
摘要:一是如何工作的在上是這樣描述的運算符用于測試構造函數的屬性是否出現在對象原型鏈中的任何位置換句話說,如果,那么必須是一個對象,而必須是一個合法的函數。下面我們舉一個例子一步步來說明第一步每一個構造函數都有一個屬性。 在 JavaScript 中,我們通常用 typeof 判斷類型,但是在判斷引用類型的值時,常常會遇到一個問題:無論引用的是什么類型的對象,都會返回 object(當然還有...
本文主要是給大家介紹的是,Python中正則表達式如何實現重疊匹配的具體操作方法,給大家貼出了具體實例代碼,希望能給各位讀者帶來一定的幫助。正則表達式實現重疊匹配importregex string='100101010001' str_re='101' print(regex.findall(str_re,string,overlapped=True))普通的...
閱讀 1321·2021-11-16 11:45
閱讀 2241·2021-11-02 14:40
閱讀 3882·2021-09-24 10:25
閱讀 3032·2019-08-30 12:45
閱讀 1261·2019-08-29 18:39
閱讀 2476·2019-08-29 12:32
閱讀 1607·2019-08-26 10:45
閱讀 1923·2019-08-23 17:01