ホームページ >Java >&#&チュートリアル >コレクション用の堅牢な hashCode() メソッドを実装するにはどうすればよいですか?

コレクション用の堅牢な hashCode() メソッドを実装するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-14 12:38:11789ブラウズ

How to Implement a Robust hashCode() Method for Collections?

コレクションへの hashCode() の実装: ベスト プラクティスと考慮事項

コレクション内の hashCode() メソッドの最適な実装を決定することは微妙なタスクであり、次の影響を大きく受けます。具体的な使用パターン。ただし、広く認知されている効果的なアプローチは、Josh Bloch 氏の独創的な著書「Effective Java」(項目 8、第 2 版) で概説されています。

Josh Bloch 氏の提案された実装

Bloch 氏によると、推奨事項として、効率的な hashCode() を作成するには次の手順に従う必要があります。メソッド:

  1. ゼロ以外 値を使用して int 結果変数を初期化します。
  2. equals() メソッドに含まれる各フィールド f を反復処理します。
  3. その値に基づいて各フィールド f のハッシュ コード c を計算します。 type:

    • ブール値の場合: (f ? 0 : 1)
    • プリミティブ型 (byte、char、short、int) の場合: (int)f
    • 長い場合: (int)(f ^ (f >>> 32))
    • float の場合: Float.floatToIntBits(f)
    • double の場合: Double.doubleToLongBits(f) (long として扱われます)
    • オブジェクトの場合: hashCode() の結果、または f == null
    • の場合は 0 配列の場合: 再帰的各要素のハッシュ値を計算します
  4. 計算されたハッシュ値 c と結果を組み合わせます:

    result = 37 * result + c
  5. 最終結果を返します。

アプローチの背後にある理論的根拠

このアプローチは、equals() メソッドでテストされたすべてのフィールドのハッシュ コードを効果的に組み合わせることで、ほとんどのユースケースでハッシュ値が適切に分散されるようにします。結合ステップで 37 を乗算すると、分布がさらに強化されます。

結論

普遍的に「最適な」実装は存在しない可能性がありますが、Bloch が推奨するアプローチは、効果的な hashCode( ) コレクションのメソッド。使用パターンを慎重に検討し、概要を示した手順を適用することで、開発者は、contains() や get() などのハッシュベースの操作に関してコレクションが最適に実行されることを保証できます。

以上がコレクション用の堅牢な hashCode() メソッドを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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