首頁  >  文章  >  Java  >  Java中"abc"和new String("abc")有什麼不同?

Java中"abc"和new String("abc")有什麼不同?

不言
不言轉載
2019-03-22 09:54:232986瀏覽

這篇文章帶給大家的內容是關於Java中"abc"和new String("abc")有什麼不同?有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

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."<init>":()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."<init>":(Ljava/lang/String;)V
      12: astore_2
      13: return
}</init></init>

我們主要看下面這段關於main方法的文本,裡面涉及的指令不多,我整理了一下

ldc:將常亮加載到操作數棧
astore_1: 將棧頂元素的值儲存到變數1
new: 為要建立的類別實例開闢記憶體空間,並將位址壓入操作數棧
dup: 複製操作數棧頂值,並將其壓入棧頂
invokespecial:呼叫方法,範例中的方法是類別的建構器

現在我們結合指令和操作數棧,來模擬一次計算

Java中abc和new String(abc)有什麼不同?

回到最開始的問題,a="123"和a=new String("123")的區別,前者指向的是常數池的位址,後者指向的是堆中新開闢的地址。這兩個 == 的結果,自然是不相等的。 equals的結果呢? equals是字元逐一比較內容,是相等的。

這篇文章到這裡就已經全部結束了,更多其他精彩內容可以關注PHP中文網的Java教學影片專欄!

以上是Java中"abc"和new String("abc")有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除