簡單總結來說,==比較的是2個對象的位址,而equals比較的是2個對象的内容。
顯然,當equals為true時,==不一定為true;
值類型是存儲在記憶體中的堆棧(以後簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的位址,而其本身則存儲在堆中。
==操作比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量在堆中存儲的位址是否相同,即棧中的内容是否相同。
equals操作表示的兩個變量是否是對同一個對象的引用,即堆中的内容是否相同。
一、String中的equals和==
1、
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
}
}
上面這段程式中,到底有幾個對象呢?
來檢測一下吧,稍微改動一下程式
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}
編譯并運作程式,輸出:s1 == s2
說明:s1 與 s2 引用同一個 String 對象 -- "Monday"!
2.
再稍微改動一下程式,會有更奇怪的發現:
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
if (s1.equals(s2))
System.out.println("s1 equals s2");
else
System.out.println("s1 not equals s2");
}
}
我們将 s2 用 new 操作符建立
程式輸出:
s1 != s2
s1 equals s2
說明:s1 s2分别引用了兩個"Monday"String對象