JavaはMapでKeyとして複雑なデータタイプを使用します。
1335 ワード
時々このようにしたいです。
つまり、私たちは
Thinin Javaにおける設計自己反性です。 です。対称性。 である。リレー性。 である。一致性です。 もし である。
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