24

メソッドのネイティブ実装を理解しようとしていhashCode()ます。このメソッドは正確に何を返しますか? メモリアドレスですか、それともランダム値ですか?

4

3 に答える 3

40

.hashCode()ネイティブ実装は JVM に依存します。

たとえば、HotSpot には 6 つObject.hashCode()の実装があります。コマンドライン経由で JVM を実行するフラグを使用して選択できます-XX:hashCode=n。ここで、n:

0 – Park-Miller RNG (デフォルト)
1 – f(address, global_statement)
2 – 定数 1
3 – シリアル カウンター
4 – オブジェクト アドレス
5 – スレッド ローカル Xorshift

于 2013-04-19T13:33:36.903 に答える
22

ドキュメントから:

合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は Java TMプログラミング言語では必要ありません。)

したがって、メモリアドレスに関連している可能性がありますが、必ずしもそうである必要はありません。また、メモリに関連していると仮定するべきではありません。

ハッシュコードで行うことは、これをまったく気にする必要はありません。ハッシュコードから推測できることは次のとおりです。

  • 2 つのオブジェクトのハッシュ コードが同じ場合、それら等しいオブジェクトである可能性があります
  • 2 つのオブジェクトのハッシュ コードが異なる場合、それらは同等のオブジェクトではありません (オーバーライドされているかどうかにかかわらず、正しい実装を前提としています)。
于 2013-04-19T13:11:27.373 に答える
3

あなたの答えはここにあります。ドキュメントに記載されているように:

合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は Java TMプログラミング言語では必要ありません。)

于 2013-04-19T13:13:26.410 に答える