這篇文章帶給大家的內容是關於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:呼叫方法,範例中的方法是類別的建構器
現在我們結合指令和操作數棧,來模擬一次計算
回到最開始的問題,a="123"和a=new String("123")的區別,前者指向的是常數池的位址,後者指向的是堆中新開闢的地址。這兩個 == 的結果,自然是不相等的。 equals的結果呢? equals是字元逐一比較內容,是相等的。
這篇文章到這裡就已經全部結束了,更多其他精彩內容可以關注PHP中文網的Java教學影片專欄!
以上是Java中"abc"和new String("abc")有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!