ホームページ  >  記事  >  Java  >  `hashCode()` と `equals()` をオーバーライドすると、HashMap のパフォーマンスにどのような影響がありますか?

`hashCode()` と `equals()` をオーバーライドすると、HashMap のパフォーマンスにどのような影響がありますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 17:51:02789ブラウズ

How Does Overriding `hashCode()` and `equals()` Impact HashMap Performance?

HashMap でのequals と hashCode の仕組みを理解する

Java の HashMap は、hashCode() メソッドと equals() メソッドの組み合わせを使用して、キーと値を効率的に格納および取得します。ペア。新しいキーと値のペアを追加する場合、最初にキーの hashCode() メソッドが計算されて、エントリが配置されるハッシュ バケットが決定されます。次に、equals() メソッドを使用して、選択したバケット内の重複キーがチェックされます。

指定されたテスト コードでは、ToDos クラスは、equals() のプリミティブ実装を定義し、オブジェクトが同じ日付フィールドを持つことを保証します。同等とみなされます。 // public int hashCode() { return 9; という行が返されると、 } のコメントが解除されている場合、日付フィールドに関係なく、すべての ToDo オブジェクトは強制的に同じ hashCode() 値を返すようになります。その結果、日フィールドに関係なく、すべての ToDo オブジェクトが同じハッシュ バケットにマッピングされます。

コメントアウトされた行で map.size() メソッドが呼び出されると、ToDo オブジェクトは異なる日を持ちます。フィールド (t1、t2、t3) は、それぞれ異なる hashCode() 値のため、異なるハッシュ バケットに配置されます。その結果、map.size() は正確に 3 というカウントを返します。

逆に、行のコメントが解除されると、ToDo オブジェクトはすべて同じハッシュ バケットにマップされ、その後、map.size() メソッドが返されます。 2つ数えます。これは、HashMap がすべての ToDo オブジェクトが同じ hashCode() 値を返すため、「論理的に同等」であるとみなされるためです。

要約すると、 hashCode() メソッドとquals() メソッドの使用は次のとおりです。 HashMap の効率的な運用にとって重要です。 hashCode() メソッドのみをオーバーライドすることで、論理的に同等のキーが一貫した hashCode() 値を生成することが重要です。 equals() メソッドのみをオーバーライドすると、論理的等価性を判断するために必要な比較の数が増加するため、パフォーマンスの問題が発生する可能性があります。 hashCode() による効率的なハッシュと、equals() によるオブジェクトの同等性の確保の間で適切なバランスを取ることが、HashMap を最適に使用するための鍵となります。

以上が`hashCode()` と `equals()` をオーバーライドすると、HashMap のパフォーマンスにどのような影響がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。