2011-08-03 8 views
2

可能性の重複:
Why does Java's hashCode() in String use 31 as a multiplier?hashCodeをオーバーライドしますベストプラクティス

@Override public int hashCode() { 
    int result = 17 + hashDouble(re); 
    result = 31 * result + hashDouble(im); 
    return result; 
} 

これは、 "効果的なJavaの" からのコードです。エンタープライズアプリケーションで広く使用されていますか?私は静的な値を追加することに懸念しています。あるいは、何らかのユーティリティクラスで最終変数として17と31を定義し、そこからそれらを参照する必要がありますか?

誰かがこれらの数字のために何かを説明することができますか? 31は無作為に選ばれた素数ですか?

答えて

0

はい、私はこのようなコードを常に見ています。

は、定数を外部クラスに分解することに利点があります(プログラムが実行されている間は値を変更してはいけないことに注意してください)。

数字は多分任意に選択された可能性が高い素数です。

私が手に効果的なJavaのを持っていないが、私は次の引用を発見した:それは奇素数であるため、

値31を選択しました。それが であって、乗算がオーバーフローした場合、情報は失われます。 の乗算はシフトに相当します。 プライムを使用する利点はあまり明確ではありませんが、伝統的です。良い性質31は であり、より良い性能のために乗算をシフトと減算で置き換えることができることを示しています。31 * i ==(i < < 5) - i。現代のVMはこれを の最適化のように自動的に行います。

関連する問題