HashMap における equals と hashCode の相互作用を理解する
HashMap は、Java で効率的にキーと値を格納するために一般的に使用されるデータ構造です。 。これは、キーの比較方法と HashMap 内でのエントリの分散方法を決定する、equals と hashCode という 2 つのメソッドに大きく依存しています。
hashCode の役割
hashCode( ) は、HashMap 内の各キーの一意の整数ハッシュ コードを計算します。この値により、キーが保存される HashMap 内のバケットが決まります。特定のキーを探すときに検索スペースが削減され、get および put 操作がより効率的になります。
equals の役割
equals() は 2 つのオブジェクトを比較します。平等。 HashMap のコンテキストでは、equals() は、2 つのキーが同一のオブジェクトでなくても、論理的に同等であるかどうかを判断します。 2 つのキーが等しい場合、それらは同じバケットにマッピングされます。
hashCode と equals をオーバーライドした場合の影響
hashCode と equals の間の相互作用は、 HashMap の動作。その影響を説明するシナリオを次に示します。
1. hashCode のみをオーバーライドする:
論理的に同等のキーに対して同じハッシュ コードを返すように hashCode() のみをオーバーライドすると、キーは HashMap のバケット全体でより均等に分散されます。ただし、equals() は 2 つのキーが等しいかどうかを判断するために引き続き呼び出されるため、equals() が論理的に同等のキーを正しく識別しない場合、誤った結果が生じる可能性があります。
2. equals のみをオーバーライドする:
equals() のみがオーバーライドされ、hashCode() が論理的に同等のキーに対して異なるハッシュ コードを返す場合、キーは同じバケットにマップされません。各バケット内の線形検索が必要になるため、検索パフォーマンスが低下します。
3. hashCode と equals の両方をオーバーライドする:
正しいアプローチは、hashCode() と equals() の両方を一貫してオーバーライドすることです。 hashCode() は論理的に同等のキーに対して同じハッシュ コードを返す必要がありますが、equals() は論理的に等しいとみなされるオブジェクトに対して true を返す必要があります。これにより、効率的なキー検索と正確な値の取得が保証されます。
サンプル シナリオ
サンプル テスト コードでは、ToDos クラスにはオブジェクト ベースで比較するオーバーライドされたquals() メソッドがあります。当日のフィールドにて。これにより、同じ日を表す異なる ToDo オブジェクトが同等に扱われることが保証されます。
hashCode() メソッドのコメントが解除されると (すべてのオブジェクトに対して 9 を返す)、HashMap はキーを異なるバケットに分散します。キーは論理的に同等であるため (両方とも「月曜日」を表している)、HashMap はそれらを別個のエントリとみなしてサイズとして 2 を返します。
hashCode() メソッドがコメントアウトされると、すべての ToDo オブジェクトはデフォルトの hashCode() 実装を取得し、オブジェクトごとに異なるハッシュ コードを返します。これにより 3 つの異なるバケットが作成され、キーが一意のエントリとして扱われるため、HashMap はサイズとして 3 を正しく返します。
結論
ハッシュコード間の相互作用を理解するHashMap 内の () とquals() は、パフォーマンスを最適化するために不可欠です。これらのメソッドを適切にオーバーライドすることで、キーの論理的等価性に基づいて効率的なキー検索と正確な値の取得を保証できます。
以上がHashMap で効率的なキー検索と正確な値の取得を保証するために、「equals」と「hashCode」はどのように連携するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。