2

equals メソッドの一般的な契約には、メソッドを定義した場合はメソッドequals()も定義する必要があるというポイントがありますhashCode()。そしてo1.equals(o2)、これは musto1.hashCode() == o2.hashCode()です。

それで私の質問は、もし私がこの契約を破ったらどうなるのですか? o1.equals(o2)しかし、どこで失敗した状況をもたらすことができますo1.hashCode != o2.hashCode()か?

4

3 に答える 3

5

たとえば、ハッシュベースのデータ構造で予期しない動作が発生します。 HashMap, HashTable の仕組みを読む

于 2013-01-28T07:57:53.967 に答える
5

HashMap/HashTable/HashSet/etc は、その に基づいてオブジェクトをいくつかのバケットの 1 つに配置し、そのhashCodeバケットに既にある他のオブジェクトequal

これらのクラスは equals/hashCode コントラクトを想定しているため、他のバケット内のオブジェクトとの同等性をチェックしません。結局のところ、別のバケット内のオブジェクトは異なる hashCode を持つ必要があるため、(契約により) 問題のオブジェクトと同じにすることはできません。2 つのオブジェクトequalのハッシュ コードが異なる場合、それらは異なるバケットになる可能性があり、その場合、HashMap/Table/Set/etc はそれらを比較する機会がありません。

そのため、等しい 2 つのオブジェクトを含む Set になる可能性があります。これは想定されていません。または、同じ 1 つのキーに対して 2 つの値を含むマップ (バケットはキーによるため)。または、キーを検索できないマップ (検索ではハッシュ コードと等価性の両方がチェックされるため)。または任意の数の同様のバグ。

于 2013-01-28T08:03:23.093 に答える
4

コントラクトを破ると、オブジェクトはハッシュベースのコンテナー (およびhashCode()そのコントラクトを使用および依存するその他すべて) で機能しなくなります。

基本的な直感は次のとおりです。2 つのオブジェクトが同じかどうかを確認するために、コンテナはhashCode()両方を呼び出し、結果を比較できます。ハッシュ コードが異なる場合、コンテナーは 2 つのオブジェクトが等しくないと見なして短絡することができます。

具体的な例を挙げると、o1.equals(o2)butの場合、両方のオブジェクトを a (一意のオブジェクトを格納するためのもの)o1.hashCode() != o2.hashCode()に挿入できる可能性があります。HashMap

于 2013-01-28T07:58:15.130 に答える