hashCode()
コレクションのメソッドの最適な実装をどのように決定するのでしょうか(equals メソッドが正しくオーバーライドされていると仮定)?
ベストアンサー1
最適な実装はどれでしょうか? 使用パターンによって異なるため、難しい質問です。
ほぼすべてのケースで妥当な実装が、Josh BlochのEffective Javaの項目 8 (第 2 版) で提案されています。著者はなぜこのアプローチが優れているのかをそこで説明しているので、そこで調べるのが一番です。
短縮版
を作成し
int result
、ゼロ以外の値を割り当てます。メソッドでテストされるすべてのフィールド に対して、次の方法でハッシュ コードを計算します。
f
equals()
c
- フィールド f が a の場合
boolean
: 計算します(f ? 0 : 1)
。 - フィールド f が
byte
、char
、short
または の場合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 が配列の場合:各フィールドを個別の要素として扱い、ハッシュ値を再帰的に計算し、次に説明するように値を結合します。
- フィールド f が a の場合
ハッシュ値を
c
以下と組み合わせますresult
:result = 37 * result + c
戻る
result
これにより、ほとんどの使用状況でハッシュ値が適切に分散されるはずです。