Java設計者が、obj1.equals(obj2)の場合、obj1.hashCode()は== obj2.hashCode()でなければならないという義務を課したのはなぜですか。
5 に答える
HashMapは次のアルゴリズムを使用して、キーをすばやく検索するためです。
hashCode()
引数のキーのを取得します- このハッシュコードからバケットを推測します
- バケット内のすべてのキーを引数内のキーと比較して(を使用して
equals()
)、正しいキーを見つけます
2つの等しいオブジェクトに同じハッシュコードがない場合、アルゴリズムの最初の2つのステップは機能しません。そして、HashMapを非常に高速にするのはこれらの2つの最初のステップです(O(1))。
義務はありません。オブジェクトがHashMap/HashSetなどのハッシュベースのデータ構造で使用されることを意図している場合、これは必須条件であるため、これは良い習慣です。
ハッシュコードは、2つのオブジェクトが等しくないかどうかをすばやく判断するために使用されるためです。
私の知る限り、これは言語に組み込まれていません。技術的には、equals()メソッドがハッシュコードをチェックしないオブジェクトを作成できますが、かなり独特な結果が得られます。
特に、これらのオブジェクトの束をHashMapまたはHashSetに配置すると、マップ/セットはhashCode()メソッドを使用して、オブジェクトが重複しているかどうかを判断します。そのため、コレクションに2つのオブジェクトが格納される状況が発生する可能性があります。それぞれが異なるhashCodesを返すため、equalsとして定義されています(これは決して発生しないはずです)。
パフォーマンスを向上させるための2つのステップのマッチング。
最初のステップ:hashcode()を計算します
2番目のステップ:equals()を計算します
これは、オブジェクトをハッシュマップなどのコレクションにキーとして配置した場合、一致するハッシュコードが見つかった場合は最初にhashcode()メソッドでキーが比較され、さらにequals()が計算されるためです。
検索パフォーマンスを向上させるためのインデックス作成に似ています