JavaはMapでKeyとして複雑なデータタイプを使用します。

1335 ワード

時々このようにしたいです。
Map map = new HashMap<>();
//       
map.put(new User(1), getProfile(1));
//       
if (map.containsKey(new User(1)) {
    doSomething();
}
しかし、デフォルトではこれは成功しません。HashMapの実現においては、このように処理されています。
//      ,     null       ,       
if (key != null
    && e.hash == key.hashCode()
    && (e.key == key || key.equals(e.key)) {
    return e;
}
hashCodeが同じで、必ずしもequals()がtrueに戻るとは限りません。
つまり、私たちはequals()hashCode()を手動で実現してこそ、目的を達成できるということです。
class User {

    private Integer id;

    @Override
    public int hashCode() {  
        return this.id != null ? this.id : 0;  
    }  

    @Override
    public boolean equals(Object obj) {  
        return obj instanceof User && (this.id.equals(((User) obj).id));  
    }  
}
大功が成る
Thinin Javaにおける設計equals()の5つの原則
  • 自己反性です。x.equals(x)はtrue
  • です。
  • 対称性。x.equals(y)がtrueであれば、y.equals(x)がtrue
  • である。
  • リレー性。x.equals(y)がtrueでy.equals(z)がtrueであれば、x.equals(z)もtrue
  • である。
  • 一致性です。x.equals(y)については、判定情報が不変であれば、何回比較しても結果は同じであるべきである。
  • もしx != nullがtrueであれば、x.equals(null)はfalse
  • である。