Java中的堆(Heap)是一個運行時數據區,用來存放類的對象;棧(Stack)主要存放基本的數據類型(int、char、double等8種基本數據類型)和對象句柄。
例1
int a=5; int b=5; System.out.println(a==b);
以上例子中,編譯器首先處理int a=5,首先在棧中創建一個引用a,然后在棧中查找是否有5這個值,如果有,則將a指向5,如果沒有,則創建一個5,再將a指向5。當處理int b=5時,由於棧中肯定已經存在5,直接將b指向5,這樣a和b都指向5,因此a==b為true。
例2
int a=5; int b=5; System.out.println(a==b); b=6; System.out.println(a==b);
以上例子中,給b重新賦值以后,a和b不是指向同一個值,因此第一個a==b為true,第二個a==b為false。
例3
String a="ABC"; String b="ABC"; String c=new String("ABC"); String d=new String("ABC"); System.out.println(a==b); System.out.println(a==c); System.out.println(c==d);
以上例子中,String是一種對象,因此存放在堆中,給a和b賦值的過程和例1差不多,只不過是在堆中進行的。c和d使用了關鍵字new,因此不管堆中是否已經有這個值,都在堆中新建一個值,因此輸出結果為true,false,false。