1. ホーム

[解決済み】コレクションのhashCodeメソッドの最適な実装について

2022-03-27 04:40:44

質問

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

解決方法は?

最適な実装は?それは使用パターンに依存するため、難しい質問です。

ほぼすべてのケースに対応する合理的な実装を提案したのが ジョシュ・ブロッホ 's Effective Java の項目8(第2版)にあります。著者はそこでなぜそのアプローチが良いのかを説明しているので、そこで調べるのが一番です。

ショートバージョン

  1. を作成します。 int result を指定し ゼロでない の値を指定します。

  2. について 各フィールド f でテストされた equals() メソッドで、ハッシュコードを計算します。 c によるものです。

    • もしフィールドfが boolean : 計算する (f ? 0 : 1) ;
    • もしフィールドfが byte , char , short または int : 計算する (int)f ;
    • もしフィールドfが long : 計算する (int)(f ^ (f >>> 32)) ;
    • もしフィールドfが float : 計算する Float.floatToIntBits(f) ;
    • もしフィールドfが double : 計算する Double.doubleToLongBits(f) で、その戻り値を他のlong値と同様に処理する。
    • もしフィールドfが オブジェクト : の結果を使用する。 hashCode() メソッドの場合は0になります。 f == null ;
    • フィールドfが 配列 の場合、各フィールドを個別の要素とみなして、ハッシュ値を 再帰的な方法 を作成し、次に説明するように値を結合します。
  3. ハッシュ値を結合する cresult :

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

これにより、ほとんどの使用状況において、ハッシュ値の適切な分布が得られるはずです。