2012-07-22 1 views
27

を必要と明確化、Javaの7に、我々は最初の2は、おおよそヌル点のチェックと同じObjects.hash()Objects.hashCode対()、[OK]を

o.hashCode(); 
    Objects.hashCode(o); 

    Objects.hash(o); 

ありましたが、何が最後のものであるので、 ?

単一のオブジェクト参照が指定されている場合、返される値は で、そのオブジェクト参照のハッシュコードと等しくありません。

なぜですか?私は、同じことをする3つのメソッドは必要ないと私は理解しています。なぜ、Objects.hash()が必要なのでしょうか?あなたはいつ別のものを使うかを選択しましたか?

答えて

47

hashCodehashのドキュメントを参照してください。 hashObject...hashCodeObjectとなります。与えられた例がある:あなたがオブジェクトのシーケンスのハッシュをしたいとき

@Override public int hashCode() { 
    return Objects.hash(x, y, z); 
} 
  • Objects.hash(Object... values)は、例えば、例で使用されるべきです独自のhashCodeメソッドを定義するときに、オブジェクトのIDを構成する複数の値に対して単純にコード化されたハッシュが必要になる場合があります。
  • Objects.hashCode(Object o)は、オブジェクトがnullの場合にスローすることなく、単一のオブジェクトのハッシュが必要な場合に使用する必要があります。
  • Object::hashCode()は、単一のオブジェクトのハッシュが必要な場合に使用し、オブジェクトがnullの場合は例外をスローします。

hash(o)hashCode(o)は必ずしも同じものを返すわけではありません。 1つのオブジェクトに対して実行している場合は、おそらくhashCodeを使用してください。

+0

'hash(o)'と 'hashCode(o)'はどのような状況で同じ値を返しませんか? 'hash()'状態のドキュメント 'Warning:単一のオブジェクト参照が与えられたとき、返された値はそのオブジェクト参照のハッシュコードと等しくありません。 '、しかし私はまだそれを理解するために掘り下げています。 –

7

ObjectのデフォルトのhashCode()は、オブジェクトのメモリアドレスを返します。あなたは以下のクラスを持っているのであれば:

class Car { 
    String make; 
    String model; 
    int year; 

    public Car(String make, String model, int year) { 
     this.make = make; 
     this.model = model; 
     this.year = year; 
    } 
} 

は、2つのオブジェクトを作成します。

Car car1 = new Car("Toyota", "Corolla", 2010); 
Car car2 = new Car("Toyota", "Corolla", 2010); 

car1.hashCode()car2.hashCode()とは異なりますが、各オブジェクトが異なるメモリアドレスを持つことになりますので、 。

car1とcar2の両方で同じハッシュコードを返すようにするにはどうすればよいですか? )これは(car2.hashCodeにcar1.hashCode()は同じになります

@Override 
public int hashCode() { 
    Object[] x = {model, make, Integer.valueOf(year)}; 
    int hashArray = Arrays.hashCode(x); 
    return hashArray; 
} 

)String.hashCode(理由:この場合は、次のようにCarクラスのデフォルトオブジェクトのhashCode()メソッドをオーバーライドする必要があります文字列の内容に基づいてhashCodeを計算し、Integer.hashCode()は整数値自体を返します。

Java 7では、Objects.hash(Object ... values)を使用できます。だから、私たちの新しい車のhashCode()は次のようになります。

@Override 
public int hashCode() { 
    return Objects.hash(model, make, year); 
} 

Objects.hash(オブジェクト...値)はあなたのためをArrays.hashCodeを呼び出します。

最後に、Objects.hashCode(Object o)はnullチェックを行います。オブジェクトがnullの場合は0を返します。それ以外の場合は、オブジェクトhashCode()メソッドを呼び出します。

+0

デフォルトの 'hashCode()'は約20年間メモリアドレスを返していません。それは本当にできません。 GCはオブジェクトを動かします。いわゆるメモリアドレスは、umoveableハンドルのアドレスです。 – EJP

+0

Javaのドキュメントに基づいてhttps://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode hashCodeは、通常、オブジェクトの内部アドレスを次のように変換して実装されます。整数ですが、この実装手法はJava™プログラミング言語では必要ありません。 – ezzadeen