在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配。當在一段代碼塊中定義一個變量時,java就在棧中爲這個變量分配內存空間。
比如
void func()
{
Object obj = new Object();//這個obj在函數的棧裏。
}
class Test
{
private Object obj = new Object();//這個obj隨對應的Test對象分配在堆裏
}
堆內存用於存放由new創建的對象和數組。
"=="操作符的作用
1、用於基本數據類型的比較
2、判斷引用是否指向堆內存的同一塊地址。
equals的作用:
用於判斷兩個變量是否是對同一個對象的引用,即堆中的內容是否相同,返回值爲布爾類型
String作爲一個對象來使用
例子一:對象不同,內容相同,"=="返回false,equals返回true
String s1 = new String("java"); String s2 = new String("java"); System.out.println(s1==s2); //false System.out.println(s1.equals(s2)); //true
詳解:s1和s2只是兩個引用,存放在函數的棧中,就是堆內存中存放對象的地址,new String("java")這兩個對象在函數堆內存中分別創建了對象,所以地址值不一樣,==返回爲false,而equals 則比較兩個對象的值,所以返回true。
例子二:同一對象,"=="和equals結果相同
String s1 = new String("java"); String s2 = s1; System.out.println(s1==s2); //true System.out.println(s1.equals(s2)); //true
String作爲一個基本類型來使用
如果值不相同,對象就不相同,所以"==" 和equals結果一樣
String s1 = "java"; String s2 = "java"; System.out.println(s1==s2); //true System.out.println(s1.equals(s2)); //true