「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > `hashCode()` と `equals()` をオーバーライドすると HashMap のパフォーマンスにどのような影響がありますか?

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

2024 年 11 月 7 日に公開
ブラウズ:944

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

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

Java の HashMap では、hashCode() メソッドとquals() メソッドの組み合わせを使用して、キーと値を効率的に格納および取得します。ペア。新しいキーと値のペアを追加する場合、最初にキーの 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 を最適に使用するための鍵となります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3