2

Objects#hash(Object...)メソッドでの使用についてどう思いますhashCode()か?

int a = 1; 
boolean b = true; 
Date c = new Date(); 
String d = "1234";
Object e = new ch.example.blabla.Foo();

// Java 7
public int hashCode() {
  return Objects.hash(a, b, c, d, e);
}

// or using Java 6 
public int hashCode() {
  return Arrays.hashCode(new Object[] {a, b, c, d, e});
}

もちろん、equals(Object)メソッドを持っているなどの通常の状況下でも。hashCode()Joshua Bloch は、ビットのシフトなどのルール/レシピを使用して優れたメソッドを作成する方法を著書に書いています。

上記の例は、プリミティブ データ型のこれらの規則に従っていません。したがって、私の質問は、Bloch のレシピに従うか、Apache Commons を使用する代わりに、オブジェクト (オートボクシング) のようなプリミティブ データ型を処理してもよいHashCodeBuilderですか?

Objects#hash(Object...)は Java 7 で導入され、 のみを呼び出すArrays.hashCode(Object[])ため、この質問は Java 6 ユーザーにも焦点を当てています。

あなたの応答/アイデア/提案をありがとう!


新しい質問が原因で、古い質問が重複して閉じられる時期が本当にわかりません。

ただし、ここでより良い答えが得られる質問があります。

4

1 に答える 1

3

のようなラッパー クラスはInteger、Joshua Bloch の「Effective Java」で説明されているルールを実際に実装しますDoubleBooleanそれを強調してくれた Marko Topolnik に感謝します。

彼はまた、パフォーマンスの問題につながる可能性のある欠点についても言及しています。しかし、Jörn Horstmann は、これが現代の JVM によって最適化される可能性があると想定しています。

独自のメソッドObjects.hash(a, b, c)を記述するよりもはるかに読みやすいため、このアプローチ ( ) を使用します。hashCode()また、本当に必要な場合 (パフォーマンスの問題が発生した場合) は、プリミティブ ハッシュ コードを独自に実装します。

マルコ、ヨルン、コメントありがとう。回答を書く場合は、承認された回答を最良の回答に変更します。

于 2012-11-07T07:42:36.047 に答える