クラス Object からメソッド equals() を正しくオーバーライドする必要があります
編集:おそらく私があまり正確ではなかったために、最初の応答が誤解されたと思います。そこで、さらに説明を追加することにしました。
equals() をオーバーライドする必要があるのはなぜですか? これは、2 つのオブジェクトが等しいとはどういう意味かを決定する開発者の領域にあるためです。ほとんどの場合、参照の等価性は十分ではありません。
たとえば、キーが Person 型の HashMap があるとします。人にはそれぞれ名前と住所があります。次に、キーを使用して詳細な Bean を検索します。問題は、通常、マップ内のものと同じ参照を持つインスタンスを作成できないことです。あなたがすることは、クラス Person の別のインスタンスを作成することです。明らかに、演算子 == はここでは機能せず、equals() を使用する必要があります。
しかし今、私たちは別の問題に直面しています。コレクションが非常に大きく、検索を実行したいとします。単純な実装では、equals() を使用してキー オブジェクトをマップ内のすべてのインスタンスと比較します。しかし、それは非常に広大です。そして、ここに hashCode() が来ます。他の人が指摘したように、ハッシュコードは一意である必要のない単一の数値です。重要な要件は、equals() が 2 つのオブジェクトに対して true を返す場合は常に、hashCode() が両方に対して同じ値を返さなければならないということです。ハッシュコードはキーを一種のバケットに分割するため、逆の含意は成立しません。これは良いことです。1 つのバケットにクラス Person の少数のインスタンスがあります。検索を実行すると、アルゴリズムはすぐに正しいバケットにジャンプし、インスタンスごとに equals のみを実行できます。
もう1つポイントがあります。一部のコレクションでは、パフォーマンス上の理由だけでなく、キーとして使用されるクラスで hashCode() メソッドを適切に実装する必要があります。例としては、HashSet と LinkedHashSet があります。hashCode() をオーバーライドしない場合、デフォルトの Object hashCode() メソッドにより、「意味のある同等」と見なされる複数のオブジェクトを「重複禁止」セットに追加できます。
hashCode() を使用するコレクションの一部
- ハッシュセット
- LinkedHashSet
- ハッシュマップ
equals() と hashCode() を簡単に実装できるようにする apache commons の 2 つのクラスを見てください。