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

資訊專欄INFORMATION COLUMN

從指令的角度看"abc"和new String("abc")

doodlewind / 3031人閱讀

摘要:但是有一個(gè)的指令,可以把字節(jié)碼翻譯成人類能看懂的東西。是文件分解器,可以反編譯即對編譯的文件進(jìn)行反編譯,也可以查看編譯器生成的字節(jié)碼?,F(xiàn)在有一個(gè)類,定義入下先用編譯成字節(jié)碼,再使用進(jìn)行反編譯。

概要

Java工程師面試官偏愛的問題之一,就是"abc"和 new String("abc")的區(qū)別是什么?回答的比較好的會(huì)帶出Java堆,棧,常量池,引用等概念。但今天不止如此,我們從指令的角度,去看這個(gè)問題。

正文

我們知道,java類編譯后的字節(jié)碼是個(gè)二進(jìn)制文件,不是給人而是給機(jī)器閱讀的。但是java有一個(gè)javap的指令,可以把字節(jié)碼翻譯成人類能看懂的東西。

javap是 Java class文件分解器,可以反編譯(即對javac編譯的文件進(jìn)行反編譯),也可以查看java編譯器生成的字節(jié)碼。用于分解class文件。

現(xiàn)在有一個(gè)類,定義入下

public class A01 {
    public static void main(String ... args){
        String a = "123";
        String c = new String("123");
    }
}

先用javac A01.java編譯成字節(jié)碼,再使用javap -c A01.class進(jìn)行反編譯。得到入下文本

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
}

我們主要看下面這段關(guān)于main方法的文本,里面涉及的指令不多,我整理了一下

ldc:將常亮加載到操作數(shù)棧
astore_1: 將棧頂元素的值保存到變量1
new: 為要?jiǎng)?chuàng)建的類實(shí)例開辟內(nèi)存空間,并將地址壓入操作數(shù)棧
dup: 復(fù)制操作數(shù)棧頂值,并將其壓入棧頂
invokespecial:調(diào)用方法,例子中的方法是類的構(gòu)造器

現(xiàn)在我們結(jié)合指令和操作數(shù)棧,來模擬一次計(jì)算

回到最開始的問題,a="123"和a=new String("123")的區(qū)別,前者指向的是常量池的地址,后者指向的是堆中新開辟的地址。這兩個(gè) == 的結(jié)果,自然是不相等的。equals的結(jié)果呢?equals是字符逐個(gè)比較內(nèi)容,是相等的。

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

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

相關(guān)文章

  • 關(guān)于""創(chuàng)建字符串new String創(chuàng)建字符串

    摘要:當(dāng)使用時(shí),基本字符串和字符串對象也會(huì)產(chǎn)生不同結(jié)果,會(huì)將基本字符串作為源代碼處理,而字符串對象則被看作對象處理,返回對象。利用方法,我們可以將字符串對象轉(zhuǎn)換為其對應(yīng)的基本字符串。 筆試的時(shí)候總會(huì)遇到string 和 new String相關(guān)的問題,匯總一下 var s1 = abc var s2 = String(abc) var s3 = new String(abc) var s4 ...

    GT 評論0 收藏0
  • "instanceof 原理是什么"?大聲告訴面試官,我知道!

    摘要:一是如何工作的在上是這樣描述的運(yùn)算符用于測試構(gòu)造函數(shù)的屬性是否出現(xiàn)在對象原型鏈中的任何位置換句話說,如果,那么必須是一個(gè)對象,而必須是一個(gè)合法的函數(shù)。下面我們舉一個(gè)例子一步步來說明第一步每一個(gè)構(gòu)造函數(shù)都有一個(gè)屬性。 在 JavaScript 中,我們通常用 typeof 判斷類型,但是在判斷引用類型的值時(shí),常常會(huì)遇到一個(gè)問題:無論引用的是什么類型的對象,都會(huì)返回 object(當(dāng)然還有...

    CompileYouth 評論0 收藏0
  • Python中正則表達(dá)式如何實(shí)現(xiàn)重疊匹配

      本文主要是給大家介紹的是,Python中正則表達(dá)式如何實(shí)現(xiàn)重疊匹配的具體操作方法,給大家貼出了具體實(shí)例代碼,希望能給各位讀者帶來一定的幫助。正則表達(dá)式實(shí)現(xiàn)重疊匹配importregex string='100101010001' str_re='101' print(regex.findall(str_re,string,overlapped=True))普通的...

    89542767 評論0 收藏0

發(fā)表評論

0條評論

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