java 如何重寫equals


java中重寫equals表面上看只涉及equals與hashCode兩個方法,但如果仔細考慮發現重寫一個邏輯完整的equals並不容易,需要考慮克隆,繼承(多態)等問題,下面是最近的幾點心得

1.先使用==進行判斷,==判斷的是hashCode是否相等,可以姑且理解為對象的"內存地址",所以重寫equals必須重寫hashCode方法

2.使用getClass判斷類型,如果允許子類與父類對象相等,使用instanceof進行判斷

3.最后判斷域,域的判斷對於基本類型使用==,包裝類,字符串等非基本類型使用equals判斷

但最好的方式是Objects.equals

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)否則就是死循環了

 


免責聲明!

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



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