Java 7以降、
o.hashCode();
Objects.hashCode(o);
Objects.hash(o);
最初の2つはnullチェックとほぼ同じですが、最後の1つは何ですか?
単一のオブジェクト参照が指定された場合、戻り値はそのオブジェクト参照のハッシュコードと等しくなりません。
何故ですか?つまり、同じことを行う3つの方法は必要ないということです。それは理解していますが、なぜ必要なObjects.hash()
のですか。いつ使用することにしましたか?
hashCode
およびのドキュメントを参照してくださいhash
。 hash
時間Object...
がhashCode
かかりますObject
。与えられた例は次のとおりです。
@Override public int hashCode() {
return Objects.hash(x, y, z);
}
Objects.hash(Object... values)
オブジェクトのシーケンスのハッシュが必要な場合、たとえば、独自のhashCode
メソッドを定義し、オブジェクトのアイデンティティを構成する複数の値に対して単純にコード化されたハッシュが必要な場合に使用する必要があります。Objects.hashCode(Object o)
オブジェクトがnullの場合にスローせずに、単一のオブジェクトのハッシュが必要な場合に使用する必要があります。Object::hashCode()
単一のオブジェクトのハッシュが必要な場合に使用する必要があり、オブジェクトが null の場合は例外がスローされます。hash(o)
andhashCode(o)
は必ずしも同じものを返すとは限らないことに注意してください! 単一のオブジェクトに対して実行している場合は、おそらく を使用する必要がありますhashCode
。
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 の両方が同じハッシュ コードを返すようにするにはどうすればよいでしょうか。この場合、Car クラスのデフォルトの Object hashCode() メソッドを次のようにオーバーライドする必要があります。
@Override
public int hashCode() {
Object[] x = {model, make, Integer.valueOf(year)};
int hashArray = Arrays.hashCode(x);
return hashArray;
}
これにより、car1.hashCode() が car2.hashCode() と等しくなります。これは、String.hashCode() が文字列の内容に基づいて hashCode を計算し、Integer.hashCode() が整数値自体を返すためです。
Java 7 では、Objects.hash(Object... values) のみを使用できます。したがって、新しい Car hashCode() は次のようになります。
@Override
public int hashCode() {
return Objects.hash(model, make, year);
}
Objects.hash(Object... values) は Arrays.hashCode を呼び出します。
最後に、Objects.hashCode(Object o) が null チェックを行います。オブジェクトが null の場合は 0 を返します。それ以外の場合は、オブジェクトの hashCode() メソッドを呼び出します。