重寫Object的equals方法


今天學習了Object類,它是所有類的超類,他其中有一個很重要的方法equals方法。我們都知道兩個對象進行比較,如果是基本數據類型,那么比較的是兩個數的值是否相等,而對象比較的是地址值,如果沒有重寫equals方法,那么默認使用父類Object的equals方法,這個方法內部默認使用==進行對象的比較,但是我們知道對象是引用類型,而引用類型比較的是地址值,每個對象的地址值是不同的,所以equals方法無論如何都是返回的false,那么我們使用這個方法就沒有意義了,所以我們需要重寫equals方法,通過判斷對象的屬性的值是否相同來判斷對象是否相等。

public boolean equals(Object obj) { 
     return (this == obj); 
 }     

 

方法需要傳遞一個對象。如果是以下三種情況那么就沒有比較的必要,第一,傳遞的對象類型與該類不同可以直接返回false,第二,傳遞進來的對象為null值可以直接返回false,第三,傳遞進來的對象與該類對象一模一樣直接返回true。最后則可以進行類的屬性的判斷,使用==進行值判斷。這里要注意如果屬性類型是String,String雖然是引用類型,但是String中存在常量池的概念,通過==比較的也是值。

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (username == null) {
            if (other.username != null)
                return false;
        } else if (!username.equals(other.username))
            return false;
        return true;
    }

 但是這個方法有小的漏洞,就是無法對方法的調用者進行空值校驗,如果一個空值調用equals方法,會出現ClassCastException異常,表示代碼嘗試將對象轉換為不屬於實例的子類。這時候需要借助一個工具類Objects,該類從JDK1.7推出,擁有一系列靜態的方法來操作對象。這里說的是它的equals方法

 public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

||或運算符兩邊有一個滿足則返回true,&&運算符若左邊表達式為false則右邊表達式不運行直接返回false,這樣完美解決了空值調用equals方法出現ClassCastException的異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM