自作クラスの2つのオブジェクトを equals メソッドを使って意味的に等しい場合 true を返すようにするには
自作クラスで equals メソッドをオーバーライドする必要があります。
Object クラスの equals メソッドはまったく同じオブジェクトの場合 true を返します。
equals メソッドのオーバーライドの例
public class Sample {
public static void main(String[] args) {
Tiger t1 = new Tiger(1);
Tiger t2 = new Tiger(1);
System.out.println(t1.equals(t2));
}
}
class Tiger {
private final int t;
Tiger(int t) {
this.t = t;
}
public int tigerValue() {
return t;
}
public boolean equals(Object obj) {
if (obj instanceof Tiger) {
return ((Tiger)obj).tigerValue() == t;
} else {
return false;
}
}
}
<出力結果>
true
_______
hashCode メソッドのオーバーライド
自作クラスに equals メソッドをオーバーライドしたら hashCode メソッドもオーバーライドしましょう。
コレクションの HashMap などの Hash がつくクラスはオブジェクトを格納する際にハッシュコードを使用します。
これは検索速度の向上が意図されています。
Object クラスの hashCode メソッドは一意のハッシュコードを返します。
したがって、自作クラスでオーバーライドする際は
意味的に等しい場合は同じハッシュコードを返すようにするのが適切です。
適切かつ最も簡単な方法を Tiger クラスに実装すると
public int hashCode() {
return t;
}
となります。
自作クラスに hashCode メソッドをオーバーライドしないとコレクションで安全に使用できません。
0 件のコメント:
コメントを投稿