天天看點

Equals和==的差別,java

簡單總結來說,==比較的是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對象