【零碎JAVA】java中對象比較,equals與==的區別

在java中,我們通常使用==或者equlas去判斷兩個變量是否相等。

1.==

    當判斷兩個基本數據類型(int,long...)的是否相等的時候,不需要兩個變量數據類型相同,只要值相等就返回true。

    eg:

        int i = 65;
        float f = 65.0f;
        char c = 'A';
        System.out.println(i == f);
        System.out.println(i == c);
        System.out.println(c == f);

        他們的返回值都爲true

    當兩個引用類型的變量,使用==進行比較的時候,兩個變量必須指向同一個對象時才返回true

    eg:

        Person p = new Person("孫悟空");
        Person p2 = p;
        System.out.println(p == p2);    //此時返回true

        Person p1 = new Person("hello java");

        Person p2 = new Person("hello java");

        System.out.println(p1 == p2);    //此時返回false,因爲在堆中new了兩個Person對象,即使他們的值都爲hello java,但是他們的內存地址不一樣。

 

2.equals

    基本數據類型不能通過equals方法來進行比較,equals方法是Object中的一個方法,必須通過引用變量來調用。

    String str1 = new String("hello java");
    String str2 = new String("hello java");
    System.out.println(str1 == str2);        //false
    System.out.println(str1.equals(str2));//true

    上學的時候大家肯定都看過這樣的代碼,當時的理解是equals是比較變量的值,現在發現這個是錯誤的,String類中重寫了equals方法,使他在這種情況下根據值判斷返回了true,實際上equals如何判斷,都掌握在自己手裏面,此處的String自己封裝好了,是一個特殊的例子。

一般我們重寫equals方法會這麼寫:

    public boolean equals(Object obj){
        if(obj != null && obj instanceof Person){
            Person p = (Person)obj;
            //根據特定的屬性判斷,此處假設存在年齡這個屬性
            if(this.getAge() == p.getAge())
                return true;
        }
        return false;
   }

但是此處存在一點問題,主要是instanceof,當instanceof前面的對象是instanceof後面類的實例,或者子類實例時,都返回true,這就會帶來一些問題。

下面提供一段比較好的重寫equals的代碼:

public boolean equals(Object obj){
  //當equals前後是同一對象的時候,返回true
  if(this == obj)
   return true;
  if(obj != null && obj.getClass() == Person.class){
   Person p = (Person)obj;
   //根據特定的屬性判斷,此處假設存在年齡這個屬性
   if(this.getAge() == p.getAge())
    return true;
  }
  return false;
 }

這裏面用到了java反射裏面的知識。

          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章