2016-03-26 2 views
2

Object.hashCode()(すべてのオブジェクトのデフォルト実装)の実装がオブジェクトのメモリアドレスを与えると主張されることがよくあります。その主張は、Object.to String()によって生成される固有の出力の説明に添付されることがよくあります。Object.toStringまたはObject.hashCodeはオブジェクトのメモリアドレスを指定します

例としてhereを参照してください。

これは確かにではなく、私が知っているJVM/JREの場合はです。特に、アドレスは通常64ビットです。しかし、ガベージコレクタもオブジェクトを再配置するため、アドレスが変更されます。私はオブジェクトの初期のメモリアドレスになることができるという主張を見てきました。しかし、多くのオブジェクトが同様のアドレスを持つようになると、ハッシュコードの選択肢としては貧弱なものになります。

広く使用されているJVM/JREが、オブジェクトの(初期)メモリアドレスであったか、存在していますか?

ObjectクラスのJavaDocは、実装のhashCodeがメモリアドレスである可能性があることを示唆しています。しかし、私はそれが決して更新されていない陳腐化していると思う。

実際、現在のOracle JVMは、メモリアドレスを使用していません(ただし、そうするように構成することができます):

https://stackoverflow.com/a/16105878/545127

のhashCodeは、メモリ・アドレスであるという考えは、歴史的な加工品である:

https://stackoverflow.com/a/13860488/545127

私の質問は、どの広く使われているJVMは、その(デフォルト)implementaとしてメモリアドレスを使用(している)かどうかであります。

+2

それは設定可能です。https://stackoverflow.com/questions/16105420/java-object-hashcode-address-or-random/16105878#16105878 – Boann

+0

javadocがその文を含むように改訂されたときのSun JVMはおそらくでしょうか? (これを行う*現在の* JVMがあるかどうか尋ねることを意味しますか?) – meriton

+0

も参照してください。http://stackoverflow.com/questions/13860194/what-is-an-internal-address-in-java – Raedwald

答えて

2

オブジェクトのデフォルトのハッシュコードは一意である必要はないので、全体のアドレスを返す必要はありません。インプリメンテーションは、64ビットシステム上のビット3〜35、上位32ビットと下位32ビット、または単に下位32ビットとの間の排他的論理和(XOR)など、アドレスからビットのグループを取得できます。

しかし、多くのオブジェクトは[ガベージコレクションのために]類似のアドレスを持つため、ハッシュコードの選択肢としては不適切です。

数値的に近いハッシュコードはOKです。少数の同一のハッシュコードであっても、結びつきを解決するために等号が使用されるため、問題は生じません。ハッシュベースのコンテナでキーとして使用されるオブジェクトは、hashCodeメソッドの「良い」実装を提供することが期待されるため、デフォルトのハッシュコード実装が使用される状況は一般的に制限されています。

Oracleは、JVMのデフォルト実装では、オブジェクトの内部アドレスを使用して、それが何であれ、そのhashCodeを計算すると言います。しかし、他のJVM実装は、同じことを行うために必要とされていません。

ここquote from Oracle's documentationです:

として非常に合理的に実用的であるとして、クラスObjectで定義されてhashCode方法は、異なるオブジェクトについては異なる整数値を返します。 (これは、典型的には、整数にオブジェクトの内部アドレスを変換することによって実現されるが、この実装技術は、Java™プログラミング言語で必要とされない。)

あなたはアルゴリズムhereの実際の実装を見つけることができます。詳細はget_next_hash関数を検索してください。これは、アドレスに基づいて計算したハッシュが、簡単な変換で行われることが表示されます:HotSpotのでは

value = intptr_t(obj) ; 
+0

内部アドレスについての記述*実際には真*。私はそれ以外のことを言った記事を見た(申し訳ありません)。 – Raedwald

+0

@Raedwaldコピーペーストです[馬の口からまっすぐ](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode%28%29) – dasblinkenlight

+0

下位32ビットは、オブジェクトアドレスがワード境界上に整列されるため、貧しい選択である。 – Raedwald

関連する問題