在java中“equals”和“==”的區別

風鈴浩發表於2014-04-24

equals 方法是 java.lang.Object 類的方法。

  可以從三個方面來說明它們的區別:

   1.對於基本型別變數來說。例如int、char,它們使用“equals”和“==”的作用是相同的。

     例:

         int i=5;  int a=5;

         那麼i==a的結果是true,  i.equals(a)的結果也是true。

   2.對於字串變數來說

    字串並不是基本資料型別,而是一個引用資料型別。對於引用資料型別來說,"=="比較的是兩個物件在記憶體中的地址,"equals"比較的是兩個物件的內容。例:

      String a="abd";

      String b="abd";

      String c=new String("abd");

   (1)a==b的結果是true;a.equals(b)的結果是true。前者說明a與b的引用物件是相同,後者說明兩者的內容相同。

   (2)a==c的結果是false;a.equals(c)的結果是true。那就是說a與b引用物件不同,內容相同。

   那麼為什麼會出現這種情況呢?

   原來在程式執行的時候,它會建立一個字串緩衝池用以存放字串變數。當你宣告一個字串變數時,程式會首先檢查緩衝池中是否已有相同值的物件。如有,則直接返回這個物件的地址;若沒有,則建立一個物件並將其放入緩衝池,然後再返回地址。而(2)之所以與(1)不同,是因為建立時使用了new操作符;明確的表明了想要新建立一個物件。因此a與c的內容雖相同,但物件卻不同。

   3.從一個自定義類的方面來說

    任何類都直接或間接地是Object的子類,而Object中的equals方法卻是通過“==”來實現的,即只能夠比較兩者的物件是否相同。

   例:

        class Examply{

          Examply obj1=new Examply();

          Examply obj2=new Examply();

        }

     此時obj1.equals(obj2)的實質就是obj1==obj2,結果都是false。

    在2中,之所以可以使用equals來比較兩者的內容,是因為在java的類庫中,String類自己重寫了equals方法,因此可以比較內容。像            StringBuffer類就沒有重寫自己的equals方法,因此他在使用時也是呼叫Object的equals方法,只能比較物件。在2的舉例中,如改寫為:   

      StringBuffer a=new StringBuffer("abd");

      StringBuffer b=new StringBuffer("abd");

這時a.equals(b)的值為false。

     因此,很多時候都需要自己去重寫equals方法。

這是一個重寫的例項:
  public boolean equals(Object obj)
  {
if (this == obj) return true;
if (obj == null) return false;
if (!(obj instanceof Student)) return false;

Student s = (Student)obj;
return number.equals(s.number);
  }

相關文章