關於"a"+"b"共創建了幾個對象的問題

首先,我們先看下以下代碼的輸出情況

String s = "a" + "b";
System.out.println(s == "ab"); //  true

將這段代碼反編譯後得到如下結果

  public static void main(java.lang.String[]);
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String ab
       2: astore_1
       3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       6: aload_1
       7: ldc           #2                  // String ab
       9: if_acmpne     16
      12: iconst_1
      13: goto          17
      16: iconst_0
      17: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
      20: return

重點是這句0: ldc #2 // String ab,可以發現 從一開始"a"+"b"就是一個整體,這是因爲jvm在編譯時就去掉其中的加號,直接將其編譯成一個相連的結果存入了常量池,而不是等到運行時再去進行相加,所以運行s=="ab"結果爲true;
結論:
String s = "a" + "b";只創建了一個對象,就是ab,存於常量池中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章