ダメダメダメ。このスレッドのすべての答えは間違っているか、少なくとも部分的にしか正しくありません。
まず
Object.hashCode()
、はネイティブメソッドであるため、その実装はJVMのみに依存します。HotSpotと、 JRockitやIBMJ9などの他のVM実装との間で異なる場合があります。
あなたが尋ねている場合:
JavaでどのようにhashCode()
実装されていますか?
答えは次のとおりです。使用しているVMによって異なります。
OracleのデフォルトのJVM(HotSpot)を使用していると仮定すると、HotSpotには6つのhashCode()
実装があることがわかります。-XX:hashCode=n
コマンドラインからJVMを実行しているフラグを使用して選択できます。ここで、次のn
ようになります。
0 – Park-Miller RNG (default)
1 – f(address, global_statement)
2 – constant 1
3 – Serial counter
4 – Object address
5 – Thread-local Xorshift
上記はこの投稿からコピーされています。
また、HotSpotのソースコードを少し掘り下げると、以下のスニペットが見つかります。
if (hashCode == 0) {
value = os::random();
} else {
...
os::random()
Park-Miller疑似ランダムジェネレータアルゴリズムの実装にすぎません。
それで全部です。メモリアドレスの概念はありません。他の2つの実装、 1
および 4
はオブジェクトのメモリアドレスを使用しますが、デフォルトの実装では使用されません。オブジェクトのアドレスに基づく
概念は、主に歴史的なアーティファクトであり、もはや真実ではありません。Object.hashCode()
Object#hashCode()
JavaDoc内で次のように読むことができることを私は知っています:
(...)これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法はJava™プログラミング言語では必要ありません。
しかし、それは時代遅れで誤解を招くものです。