2つの異なるオブジェクトが同じハッシュコードを持っている場合でもSystem.identityHashCode()
、オブジェクトのメモリポインタを返すようです。Sun JDK、OpenJDKを含む32ビットJVM実装でも例外はないと思います。ただし、ソースコードは確認していません。実際には、同じものを持つ2つのオブジェクトが同じであると想定できSystem.identityHashCode()
ますか?
3 に答える
答えはいいえだ。
System.identityHashCode()は、単にObject.hashCode()を返します。
指定されたオブジェクトのクラスがhashCode()をオーバーライドするかどうかに関係なく、デフォルトのメソッドhashCode()によって返されるのと同じハッシュコードを指定されたオブジェクトに対して返します。null参照のハッシュコードはゼロです。
のためにObject.hashCode()
合理的に実用的である限り、クラスObjectによって定義されたhashCodeメソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法はJavaTMプログラミング言語では必要ありません。)
ただし、Sun JDKにはバグがあり、2つのオブジェクトが同じハッシュコードを返す可能性があることが示されています。
簡単な答えはノーです。
ドキュメントによると、System.identityHashCode(Object)
..。
指定されたオブジェクトのクラスがhashCode()をオーバーライドするかどうかに関係なく、デフォルトのメソッドhashCode()によって返されるのと同じハッシュコードを指定されたオブジェクトに対して返します。
それでは、...のドキュメントを 確認しましょう。Object.hashCode()
合理的に実用的である限り、クラスObjectによって定義されたhashCodeメソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法はJavaプログラミング言語では必要ありません。)
あなたの質問には2つだけあります:
何が
System.identityHashCode(Object)
返されますか。指定されたオブジェクトのクラスがhashCode()をオーバーライドするかどうかに関係なく、デフォルトのメソッドhashCode()によって返されるのと同じハッシュコードを指定されたオブジェクトに対して返します。null参照のハッシュコードはゼロです。
2つのオブジェクトの同等性を比較するときのハッシュコードルールは何ですか。
コントラクトによると、equals(object)メソッドを使用して2つのオブジェクトが等しい場合、それらは同じハッシュコードを持つ必要がありますが、2つのオブジェクトが同じハッシュコードを持つ場合、必ずしも等しいとは限りません。