\r\n\r\n
hashCodeは、クラスが暗黙的または明示的に、そのクラスのインスタンスに格納されているデータを1つのハッシュ値(32ビット符号付き整数)に分解するためのメソッドです。JavaにおけるequalsとhashCodeの重要な違いは、equalsが2つのオブジェクトを比較するために使われるのに対し、hashCodeはオブジェクトをどのグループに入れるべきかを決めるためにハッシュ化するために使われることです。
1. 概要と主な違い 2. Javaにおけるequalsとは 3. JavaにおけるhashCodeとは 4. 横並び比較 - 表形式でのJavaにおけるequalsとhashCode 5. まとめ
equalsメソッドは、2つのオブジェクトを比較するために使用されます。デフォルトのequalsメソッドは、オブジェクトクラスで定義されています。実装は==演算子と同様です。2つのオブジェクトの参照は、同じオブジェクトを指している場合のみ、等しいと言えます。equals メソッドをオーバーライドすることができる。
図01:イコールのあるJavaプログラム
System.out.println(s1.equals(s2)) と宣言すると、s1 と s2 は異なるオブジェクトを参照しているので、間違った答えが返ってきます。宣言と同様に、System.out.println(s1==s2)とします。
s1とs3は同じオブジェクトを参照しているので、System.out.println(s1.equals(s3))という記述が正しい答えとなる。宣言と同様に、System.out.println(s1==s3)となります。
studentクラスには、equalityメソッドがありません。そのため、equalsはオブジェクトクラスで呼び出されます。Trueは、オブジェクトの参照が同じオブジェクトを指している場合のみ表示されます。
図02:等号の書き換えを行うJavaプログラム
以上の手順で、イコールメソッドが書き直されることになる。メソッドにオブジェクトが渡され、その型が強制的にStudentにされた後、idの値がチェックされます。s1とs2のidが類似している場合、trueを返し、そうでない場合はfalseを返す。s1とs3も同じようなIDを持っているので、trueと表示されます。
ハッシュコードは、オブジェクトをどのグループに入れるかを決定するためのハッシュ処理に使用されます。オブジェクトのグループは、同じハッシュコードを共有することができます。正しいハッシュ関数は、オブジェクトを異なるグループに均等に分散させることができます。
正しいハッシュコードは、次のような性質を持つことができる。2つのオブジェクトobj1とobj2があるとします。obj1.equals (obj2) が真なら、obj1.hashCode()はobj2.hashCode()と等しいです。obj1.equals(obj2) が false ならば、obj1.hashCode() が obj2.hashCode() と等しくないことは必要ない。等しくない2つのオブジェクトが同じハッシュコードを持つこともある。
図03:equalsとhashCodeを持つStudentクラス
図04:メインプログラム
Studentクラスには、equalsメソッドとhashCodeメソッドがあります。Studentクラスのequalsメソッドは、オブジェクトを受け取ります。オブジェクトのクラスが同じでない場合は、falseを返します。idの値は両方のオブジェクトでチェックされます。両者が類似している場合はtrueが返され、そうでない場合はfalseが返される。
メインプログラムでは、オブジェクト s1 と s2 が作成されています。s1.equals (s2) が呼ばれると、equals メソッドはオーバーライドされていて、両方のオブジェクトの id 値をチェックするので、true を返します。2つのオブジェクトを参照していても、s1 と s2 の id 値は同じなので、答えは正しい。s1.equals (s2) は真なので、s1 と s2 の hashCode は等しいはずです。s1 と s2 の hashCode を表示すると同じ値になる。hashCode メソッドは HashMap のようなコレクションで使用できる。
JavaにおけるhashCodeに相当する。 | |
equalsは、Javaのメソッドで、==演算子のように動作します。このメソッドは、オブジェクトの等価性ではなく、オブジェクトの同一性をテストするために使用されます。 | hashCodeは、クラスがそのインスタンスに格納されたデータを暗黙的または明示的に1つのハッシュ値に分解するメソッドです。 |
使用方法 | |
equalsメソッドは、2つのオブジェクトを比較するために使用されます。 | このメソッドは、オブジェクトがどのグループに配置されるべきかを決定するためのハッシュに使用されます。 |
JavaにおけるequalsとhashCodeの違いは、equalsが2つのオブジェクトを比較するために使われるのに対し、hashCodeはオブジェクトをどのグループに入れるかを決めるためにハッシュ化するために使われることです。