3

まず、ここではデフォルトのhashCode()メソッドについて説明していますが、オーバーライドされるものではありません。新しいオブジェクトを作成すると、'new'演算子は、作成したオブジェクトのメモリアドレスを返します。これはJavaでは、より一般的に参照を返すと言います。私が知りたいのは、これはhashCode()によって返される値と同じですか?

私が信じているのは、それらは同じだということです。しかし、繰り返しになりますが、2 ^ 32を超えるオブジェクトがあり、hashCode()が整数(2 ^ 32の異なる数値)を返す場合、全体で衝突が発生し、オブジェクトを渡すと実際に混乱します。JVMはどのように処理しますか?

4

5 に答える 5

5

新しいオブジェクトを作成すると、'new'演算子は、作成したオブジェクトのメモリアドレスを返します。これはJavaでは、より一般的に参照を返すと言います。

まあ、参照は確かにアドレスである必要はありません。これはオブジェクトを参照する方法です。ビットの正確な値はJVMの実装によって異なります。

私が知りたいのは、これはhashCode()によって返される値と同じですか?

必ずしも。あなたは確かにその面でいかなる仮定もしようとすべきではありません。繰り返しますが、これは実装の詳細です。

ガベージコレクターはメモリ内でオブジェクトを移動できますが(参照を更新しながら)、これに基づいてハッシュコードを変更してはなりません。これは、提案に反する議論です。

しかし、繰り返しになりますが、2 ^ 32を超えるオブジェクトがあり、hashCode()が整数(2 ^ 32の異なる数値)を返す場合、全体で衝突が発生し、オブジェクトを渡すと実際に混乱します。

はい、ハッシュコードの衝突が発生します。それは避けられません-ハッシュコードを使用するものはすべて、衝突の可能性を考慮に入れる必要があります。ただし、参照の衝突は発生しません。232を超える値を同時にサポートできるJVMは、ハッシュコードと参照の値を同じにすることはできません。

于 2012-06-16T08:07:23.550 に答える
2

これはJavaでは、より一般的に参照を返すと言います。私が知りたいのは、これはhashCode()によって返される値と同じですか?

Object#HashCode (私のハイライト)から:

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

したがって、これはプログラマーには不透明です。
知っておく必要があるのは、オブジェクトnewのaを取得し、 aがオブジェクトのhashCodeを表す整数への内部アドレスの変換に基づく「レシピ」であるということだけです。これは、メモリ領域に関係なく同じです。オブジェクトは現在存在します(たとえば、GCの動きによる)handlerhashCode

于 2012-06-16T08:19:33.073 に答える
1

ハッシュコードは一意である必要はないため、64ビット空間で2つのオブジェクトのアドレスを変換した結果、ハッシュコードが衝突しても問題はありません。異なるオブジェクトのハッシュコードが異なる必要はありません。等しいオブジェクトのハッシュコードは同じです。

Real Life TMでは、デフォルトhashCode値はオブジェクトのアドレスと疑わしいほど似ています。ただし、この情報はJavaプログラマーには役に立ちません。ハッシュコードがオブジェクトのアドレスと等しい場合でも、Javaはこの知識を利用するメカニズムを提供せず、実装の詳細が役に立たなくなります。

于 2012-06-16T08:09:44.060 に答える
0

newJavaではメモリアドレスを返しません。さらに、Javaはメモリ内のオブジェクトを再配置できます(実際に再配置します)。したがってhashCode()、Javaでの実装はメモリアドレスを返すことができますが、オブジェクトの存続期間にわたって安定しないため、おそらくそうではありません。

hashCodeは一意である必要はありません。hashCodeがオブジェクトの識別に使用される場合(たとえば)、衝突を解決するためHashMapにの実装とペアにする必要があります。equals()

于 2012-06-16T08:09:05.240 に答える
0

新しいオブジェクトを作成すると、「new」演算子は作成したオブジェクトのメモリアドレスを返します

いいえ。Java参照を返します。ガベージコレクションとオブジェクトの移動が可能であるという意味から、賭けることができるのは、それがメモリアドレスではないということです。

これは、hashCode()によって返される値と同じですか?

いいえ。特にhashCode()がオーバーライドされている場合、hashCodeはメモリアドレスではありません。

私が信じているのは、それらは同じだということです。

あなたの信念は根拠がありません。

しかし、繰り返しになりますが、2 ^ 32を超えるオブジェクトがあり、hashCode()が整数(2 ^ 32の異なる数値)を返す場合、全体で衝突が発生し、オブジェクトを渡すと実際に混乱します。JVMはどのように処理しますか?

したがって、明らかにあなたの信念は間違っています。64ビットの実装も検討してください。ここでの唯一の問題はあなたの仮定です。

于 2012-06-16T12:31:46.350 に答える