什么時(shí)候該覆蓋equals?
簡(jiǎn)單來說,需要對(duì)象比較邏輯相等(不是對(duì)象相等的意思) ,并且超類沒有滿足條件。比如:Integer或者Date懂酱。
覆蓋equals通用約定
以下x不考慮為null情況
- 自反性 x.equals(x) == true
- 對(duì)稱性 因?yàn)?x.equals(y) == true ,所以 y.equals(x) == true
- 傳遞性 因?yàn)?x.equals(y) == true, y.equals(z) ==true 所以 x.equals(z) == true。
- 一致性 只要x.equals()方法用到變量信息沒有改變速址, x.equals(y) 結(jié)果總會(huì)一致
- 非空性 因?yàn)閥 == null 所以 x.equals(z) == false
作者的建議
- 覆蓋equals時(shí)必須覆蓋hashCode
- 不要企圖讓equals方法過于智能 單純判斷域中的值玩焰,而不是各種等價(jià)關(guān)系 。例如File類不應(yīng)該試圖把指向同一個(gè)文件的鏈接當(dāng)作相等的對(duì)象來看芍锚,當(dāng)然File類也沒有這么做昔园。
- 不要將equals聲明中的Object對(duì)象替換為其他的類型