hashCode()メソッドの書き換え
1336 ワード
良いハッシュ関数は、通常、「異なるオブジェクトに等しくないハッシュコードを生成する」傾向にあります.理想的には、ハッシュ関数は、集合内の等しくないインスタンスを可能なすべてのハッシュ値に均一に分布させるべきである.
簡単なハッシュ方法を次に示します.
1、ゼロ以外の定数、例えば17をresultというintタイプの変数に保存します.2、オブジェクト内の各キードメインf(equalsメソッドに関連する各ドメインを指す)について、a、そのドメインにintタイプのハッシュコードc:iを計算し、そのドメインがbooleanタイプである場合、計算(f?1:0)を完了する.ii、ドメインがbyte、char、shortまたはintタイプである場合、(int)fが計算される.iii、ドメインがlongタイプであれば(int)(f^(f>>>32))を計算する.iv、当該ドメインがfloatタイプである場合、Floatを計算する.floatToIntBits(f). v.ドメインがdoubleタイプの場合、Doubleを計算する.doubleToLongBits(f)を選択し、手順2に従います.a.iiiは、得られたlongタイプ値のハッシュ値を計算する.vi、ドメインがオブジェクト参照であり、クラスのequalsメソッドがequalsを再帰的に呼び出すことによってこのドメインを比較する場合、同様にこのドメインのhashCodeを再帰的に呼び出す.より複雑な比較が必要な場合は、このドメインに対してスキーマを計算し、hashCodeを呼び出します.このドメインの値がnullの場合、0を返します(他の定数でもいいです).vii、ドメインが配列である場合、各要素を個別のドメインとして処理します.すなわち、上記ルールを再帰的に適用する、重要な要素ごとにハッシュコードを計算し、ステップ2に従う.bのやり方では、これらのハッシュ値を組み合わせます.配列ドメインの各要素が重要である場合、リリース1.5で追加するArraysの1つを利用することができる.hashCodeメソッド.b、次の式に従って、手順2.aで計算されたハッシュコードcはresultにマージされる.
result = 31 * result + c;
//ここで31は奇素数であり、乗算の代わりにシフトと減算を用いると、より良い性能が得られる:31*i=(i<<5)-i、JVMは自動的にこの最適化を完了することができる.
3、resultの例を返します.
簡単なハッシュ方法を次に示します.
1、ゼロ以外の定数、例えば17をresultというintタイプの変数に保存します.2、オブジェクト内の各キードメインf(equalsメソッドに関連する各ドメインを指す)について、a、そのドメインにintタイプのハッシュコードc:iを計算し、そのドメインがbooleanタイプである場合、計算(f?1:0)を完了する.ii、ドメインがbyte、char、shortまたはintタイプである場合、(int)fが計算される.iii、ドメインがlongタイプであれば(int)(f^(f>>>32))を計算する.iv、当該ドメインがfloatタイプである場合、Floatを計算する.floatToIntBits(f). v.ドメインがdoubleタイプの場合、Doubleを計算する.doubleToLongBits(f)を選択し、手順2に従います.a.iiiは、得られたlongタイプ値のハッシュ値を計算する.vi、ドメインがオブジェクト参照であり、クラスのequalsメソッドがequalsを再帰的に呼び出すことによってこのドメインを比較する場合、同様にこのドメインのhashCodeを再帰的に呼び出す.より複雑な比較が必要な場合は、このドメインに対してスキーマを計算し、hashCodeを呼び出します.このドメインの値がnullの場合、0を返します(他の定数でもいいです).vii、ドメインが配列である場合、各要素を個別のドメインとして処理します.すなわち、上記ルールを再帰的に適用する、重要な要素ごとにハッシュコードを計算し、ステップ2に従う.bのやり方では、これらのハッシュ値を組み合わせます.配列ドメインの各要素が重要である場合、リリース1.5で追加するArraysの1つを利用することができる.hashCodeメソッド.b、次の式に従って、手順2.aで計算されたハッシュコードcはresultにマージされる.
result = 31 * result + c;
//ここで31は奇素数であり、乗算の代わりにシフトと減算を用いると、より良い性能が得られる:31*i=(i<<5)-i、JVMは自動的にこの最適化を完了することができる.
3、resultの例を返します.
public int hashCode() {
int result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
return result;
}