equals()
equals()は、オブジェクトの内容が同じかどうかを比較します。一般的に同値比較と呼ばれ、equals()を再定義しない場合、内部的に==と同じであるため、同一比較が行われます。そのため、オブジェクトを正しく同値比較したい場合は、必ずequals()を使用する必要があります。
hashCode()
hashCode()は、2つのオブジェクトが同じオブジェクトかどうかを確認します。==と同じ同一比較機能を果たしますが、hashCode()メソッドは戻り値として、ランタイム中のオブジェクトの一意の整数値を返します。一般的に、ヒープに格納されているオブジェクトのメモリアドレスを返します。
このメソッドにはnativeキーワードが付けられていますが、これはJava以外の言語で開発された言語をJavaで使用する場合に使用するキーワードです。
ハッシュとは?
ハッシュは、ハッシュ関数を使用して、可変長の入力値から固定長の出力値を生成するプロセスを意味します。ハッシュによって得られた値をハッシュコードと言います。
equals()とhashCode()
同一のオブジェクトは同一のメモリアドレスを持つ必要があるため、同一のオブジェクトは同一のハッシュコードを持つ必要があることは明らかです。したがって、equals()だけでなくhashCode()も一緒に再定義して、同一のハッシュコードを保証するようにコードを作成することが望ましいです。
ハッシュデータ構造
上記のように、HashSetデータ構造に同等のオブジェクト2つを挿入してみましょう。このSetのサイズを出力すると、2が表示されます。なぜでしょうか?
ハッシュを使用したデータ構造は、キーを決定する際にhashCode()を使用するためです。つまり、オブジェクトが同一かどうかを比較する前に、2つのオブジェクトのハッシュコードが同一かどうかを比較し、その後、2つのオブジェクトが同等かどうかを判断します。このとき、hashCode()が再定義されていない場合、ObjectのhashCode()が使用されるため、各オブジェクトが格納されているメモリアドレスが返されます。したがって、ハッシュデータ構造を使用する場合は、equals()に加えてhashCode()も再定義することが推奨されます。
出典
予想面接質問と回答
equals()とhashCode()はなぜ一緒に使用するのか?
ハッシュを使用したデータ構造は、キーを決定する際にhashCode()を使用するためです。つまり、オブジェクトが同一かどうかを比較する前に、2つのオブジェクトのハッシュコードが同一かどうかを比較し、その後、2つのオブジェクトが同等かどうかを判断します。このとき、hashCode()が再定義されていない場合、ObjectのhashCode()が使用されるため、各オブジェクトが格納されているメモリアドレスが返されます。したがって、ハッシュデータ構造を使用する場合は、equals()に加えてhashCode()も再定義することが推奨されます。
コメント0