1. 程式人生 > >Java中 ==和 equals的區別以及equals的重寫

Java中 ==和 equals的區別以及equals的重寫

==和 equals 都是比較的,而前者是運算子,後者則是一個方法

基本資料型別和引用資料型別都可以使用運算子==,  而只有引用型別資料才可以使用 equals

==操作符專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中所儲存的數值是否相同

要比較兩個基本型別的資料或兩個引用變數是否相等,只能用==操作符。

equals 方法是用於比較兩個獨立物件的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個物件是獨立的。

例如,對於下面的程式碼

String s = new String("hei");
String s2 = new String("hei");
System.out.println(s.equals(s2));//輸出true,因為String類已經重寫了equals方法
System.out.println(s == s2);//輸出 false,因為兩者的地址是不同的,s和s2屬於兩個物件

如果一個類沒有自己定義 equals 方法,那麼它將繼承 Object 類的 equals 方法,Object 類的 equals 方法的實現程式碼如下:

boolean equals(Object o){
return this==o;
}

這說明,如果一個類沒有自己定義 equals 方法,它預設的 equals 方法(從 Object類繼承的)就是使用==操作符,

也是在比較兩個變數指向的物件是否是同一物件,這時候使用 equals 和使用==會得到同樣的結果,

如果比較的是兩個獨立的物件則總返回 false。

如果你編寫的類希望能夠比較該類建立的兩個例項物件的內容是否相同,那麼你必須覆蓋equals 方法,由你自己寫程式碼來決定在什麼情況即可認為兩個物件的內容是相同的

 equals重寫

1:需要向下轉型,2:存在不同型別物件比較的風險

equals方法,用於比較兩個物件是否相同,它其實就是使用兩個物件的記憶體地址在比較。

Object類中的equals方法內部使用的就是==比較運算子。

在開發中要比較兩個物件是否相同,經常會根據物件中的屬性值進行比較,也就是在開發經常需要子類重寫equals方法根據物件的屬性值進行比較。如下程式碼演示:

/*

    描述人這個類,並定義功能根據年齡判斷是否是同齡人

    由於要根據指定類的屬性進行比較,這時只要覆蓋Object中的equals方法

    在方法體中根據類的屬性值進行比較

 */

class Person extendsObject{

    int age ;

    //複寫父類的equals方法,實現自己的比較方式

    public boolean equals(Object obj) {

        //判斷當前呼叫equals方法的物件和傳遞進來的物件是否是同一個

        if(this == obj){

            return true;

        }

        //判斷傳遞進來的物件是否是Person型別

        if(!(obj instanceof Person)){

            return false;

        }

        //將obj向下轉型為Perosn引用,訪問其屬性

        Person p = (Person)obj;

        return this.age == p.age;

    }

}

注意:在複寫Object中的equals方法時,一定要注意public boolean equals(Object obj)的引數是Object型別,在呼叫物件的屬性時,一定要進行型別轉換,在轉換之前必須進行型別判斷。