堆是用來存放由 new 建立的物件和陣列,即動態申請的記憶體都存放在堆區。棧是用來存放在方法中定義的一些基本型別的變數和物件的參照變數。Java 中一般使用 new 來建立物件,它可以動態地為一個物件分配地址。它的通用格式如下:
classname obj = new classname( );
其中,obj 是建立的物件,classname 是類的名字,類名後邊的( )
指明了類的構造方法。構造方法定義了當建立一個物件時要進行的操作。public class Test { public static void main(String[] args) { String a = "C語言中文網"; String b = new String("C語言中文網"); String c = "C語言中文網"; String d = new String("C語言中文網"); System.out.println(a == b); System.out.println(a == c); System.out.println(d == b); System.out.println(a); a = "Java"; System.out.println(a); } }輸出結果為:
false
true
false
C語言中文網
Java
String a;
只是在棧中建立了一個 String 類的物件參照變數 a。String a = "C語言中文網";
在棧中建立一個 String 類的物件參照變數 a,然後查詢棧中有沒有存放“C語言中文網”,如果有則直接指向“C語言中文網",如果沒有,則將”C語言中文網“存放進棧,再指向。String a = new String("C語言中文網");
不僅在棧中建立一個 String 類的物件參照變數 a,同時也在堆中開闢一塊空間存放新建的 String 物件“C語言中文網”,變數 a 指向堆中的新建的 String 物件”C語言中文網“。==
用來比較兩個物件在堆區存放的地址是否相同。根據上面的輸出結果,我們可以看出:
==
操作時,兩個地址是不同的。這就說明,每次物件進行 new 操作後,系統都為我們開闢堆區空間,雖然值是一樣,但是地址卻是不一樣的。==
比較時,比較的是具體的值。如果變數的值存放在堆中,使用==
比較時,比較的是值所在的地址。因此在變數 a 與變數 c 進行==
操作的時候,返回 true,因為變數 a 和變數 c 比較的是具體的值,即“C語言中文網”。注意:如果需要比較兩個使用 new 建立的物件具體的值,則需要通過“equal()”方法去實現,這樣才是比較參照型別變數具體值的正確方式。