今天學習了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的異常。