天天看點

thinking in java (五) ----- equals()方法equals()

equals()

equals()方法用來比較兩個對象是否相等,父類是Object。其中在String中的equals()源代碼如下

y

thinking in java (五) ----- equals()方法equals()

對象都是由引用reference和對象執行個體組成的。“==”是用來比較兩個引用類型的reference,是以Object中的equals()方法是比較兩個引用類型的reference是否相等。和"=="的效果是一樣的。但是我們可以看到源代碼中,如果對象是String類型的話,就會進行内容上的比較。實際上,在JDK中,Msth,String等封裝類都對equals()方法進行了重寫。

在java規範中,應該使用的幾個規則:

equals方法在飛空對象引用上實作相等關系

  1. 自反性:對于任何非空引用X,X.equals(X)都應該傳回true
  2. 對稱性:對于任何非空引用X和Y,當且僅當X.equals(Y)才為true時,Y.equals(X)才為true
  3. 傳遞性:對于任何非空引用X,Y,Z.如果X.equals(Y)為true。Y.equals(Z)為true,那麼X.equals(Z)為true
  4. 一緻性:對于任何非空引用X,Y,多次調用X.equals(Y)始終為true或者始終為false,前提是XY中資訊并沒有被修改
  5. 對于任何非空引用X,X.equals(NULL)都應該傳回false

重寫equals注意事項(不用instanceof關鍵字判斷類型)

衆所周知,instanceof關鍵字的作用是判斷左邊對象是否是右邊的執行個體,傳回boolean類型的資料,可以用來判斷繼承中的子類執行個體是否是父類的實作。也就是說子類的執行個體instanceof父類,也會傳回true。示例如下

父類Person

public class Person {
    protected String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public Person(String name){
        this.name = name;
    }
    
    public boolean equals(Object object){
        if(object instanceof Person){
            Person p = (Person) object;
            if(p.getName() == null || name == null){
                return false;
            }
            else{
                return name.equalsIgnoreCase(p.getName());
            }
        }
        return false;
    }
}
           

子類Employee

public class Employee extends Person{
    private int id;
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Employee(String name,int id){
        super(name);
        this.id = id;
    }
    
    /**
     * 重寫equals()方法
     */
    public boolean equals(Object object){
        if(object instanceof Employee){
            Employee e = (Employee) object;
            return super.equals(object) && e.getId() == id;
        }
        return false;
    }
}
           

測試類

public class Test {
    public static void main(String[] args) {
        Employee e1 = new Employee("chenssy", 23);
        Employee e2 = new Employee("chenssy", 24);
        Person p1 = new Person("chenssy");
        
        System.out.println(p1.equals(e1));
        System.out.println(p1.equals(e2));
        System.out.println(e1.equals(e2));
    }
}
           

傳回結果

true
true
false
           

在測試類裡面定義了兩個員工和一個普通人,都是同名,但是肯定不是同一個人,但是傳回比較結果卻不是false false  false,

這就是因為Person中的equals方法中是用 的instanceof判斷類型,Employee繼承與Person,類型判斷結果為true,而name也相同,是以結果為true。

是以重寫equals的時候,需要進行類型判斷就使用getClass,

其中Person中的equals方法修改為:

public boolean equals(Object object){
        if(object != null && object.getClass()== this.getClass()){
            Person p = (Person) object;
            if(p.getName() == null || name == null){
                return false;
            }
            else{
                return name.equalsIgnoreCase(p.getName());
            }
        }
        return false;
    }
           

參考文獻:https://www.cnblogs.com/chenssy/p/3416195.html

繼續閱讀