[解決済み】コレクションのhashCodeメソッドの最適な実装について
2022-03-27 04:40:44
質問
の最適な実装はどのように決定すればよいのでしょうか?
hashCode()
メソッドが正しくオーバーライドされていると仮定して)?
解決方法は?
最適な実装は?それは使用パターンに依存するため、難しい質問です。
ほぼすべてのケースに対応する合理的な実装を提案したのが ジョシュ・ブロッホ 's Effective Java の項目8(第2版)にあります。著者はそこでなぜそのアプローチが良いのかを説明しているので、そこで調べるのが一番です。
ショートバージョン
-
を作成します。
int result
を指定し ゼロでない の値を指定します。 -
について 各フィールド
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が 配列 の場合、各フィールドを個別の要素とみなして、ハッシュ値を 再帰的な方法 を作成し、次に説明するように値を結合します。
-
もしフィールドfが
-
ハッシュ値を結合する
c
とresult
:result = 37 * result + c
-
戻る
result
これにより、ほとんどの使用状況において、ハッシュ値の適切な分布が得られるはずです。
関連
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] Java- <T extends Comparable<T>>の意味?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み] コレクションを反復処理し、ループ内でオブジェクトを削除する際に ConcurrentModificationException を回避する。
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Javaで拡張子なしのファイル名を取得する方法は?
-
[解決済み] javacが「using unchecked or unsafe operations」という警告を出す原因は何ですか?
-
[解決済み] 要素 'beans' の宣言が見つかりません。
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] 親から継承したメソッドの可視性を下げることができない [重複]。
-
[解決済み] javaでAnnotation Inheritanceのようなものはあるのでしょうか?
-
[解決済み] publicId と systemId の間に空白が必要です。
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6
-
[解決済み] Java: getInstanceとStaticの比較
-
[解決済み] HashMapのキー存在チェック