java中重寫equals表面上看只涉及equals與hashCode兩個方法,但若是仔細考慮發現重寫一個邏輯完整的equals並不容易,須要考慮克隆,繼承(多態)等問題,下面是最近的幾點心得java
1.先使用==進行判斷,==判斷的是hashCode是否相等,能夠姑且理解爲對象的"內存地址",因此重寫equals必須重寫hashCode方法緩存
2.使用getClass判斷類型,若是容許子類與父類對象相等,使用instanceof進行判斷3d
3.最後判斷域,域的判斷對於基本類型使用==,包裝類,字符串等非基本類型使用equals判斷對象
但最好的方式是Objects.equalsblog
4.重寫hashCode,調用Objects.hashCode便可繼承
看下Objects.equals的源碼內存
先使用==進行判斷,而後判空,調用equals,這讓我想起了兩個包裝類型比較的問題,拿Integer來講,一般我會先判空,而後調用intValue用==進行判斷,或者先判空,而後調用equals.雖然有-128~127的緩存機制,但直接使用==判斷包裝類型每每是有問題的,而使用前面的兩種都要先判空,否則NPE,而直接調用Objects.equals就沒有這個問題了字符串
此外從上面看到Objects.equals調用了對象的equals,假設定義了類A,B,對象爲a,b,若是A重寫了equals,千萬不能在equals中直接調用Object.equals(a,b)不然就是死循環了get