コレクションのhashCodeメソッドの最適な実装 質問する

コレクションのhashCodeメソッドの最適な実装 質問する

hashCode()コレクションのメソッドの最適な実装をどのように決定するのでしょうか(equals メソッドが正しくオーバーライドされていると仮定)?

ベストアンサー1

最適な実装はどれでしょうか? 使用パターンによって異なるため、難しい質問です。

ほぼすべてのケースで妥当な実装が、Josh BlochEffective Javaの項目 8 (第 2 版) で提案されています。著者はなぜこのアプローチが優れているのかをそこで説明しているので、そこで調べるのが一番です。

短縮版

  1. を作成しint resultゼロ以外の値を割り当てます。

  2. メソッドでテストされるすべてのフィールド に対して、次の方法でハッシュ コードを計算します。fequals()c

    • フィールド f が a の場合boolean: 計算します(f ? 0 : 1)
    • フィールド f がbytecharshortまたは の場合int: を計算します(int)f
    • フィールド f が a の場合long: 計算します(int)(f ^ (f >>> 32))
    • フィールド f が a の場合float: 計算しますFloat.floatToIntBits(f)
    • フィールド f が a の場合double:Double.doubleToLongBits(f)すべての long 値と同様に戻り値を計算して処理します。
    • フィールド f がオブジェクトの場合: メソッドの結果hashCode()、または 0 を使用しますf == null
    • フィールド f が配列の場合:各フィールドを個別の要素として扱い、ハッシュ値を再帰的に計算し、次に説明するように値を結合します。
  3. ハッシュ値をc以下と組み合わせますresult:

    result = 37 * result + c
    
  4. 戻るresult

これにより、ほとんどの使用状況でハッシュ値が適切に分散されるはずです。

おすすめ記事