5

オブジェクトを渡すときは、その参照を値として渡していることを知っています。しかし、あなたが得たこの値はhashcode()正しい方法を使用しています(私のテストによれば同じです)? はメモリ アドレスではなく、常に一意の値を取得できる保証もないためhashcode()、オブジェクトを渡すときに衝突などの奇妙なことが起こる可能性はありますか?

(オーバーライドされていないと仮定hashcode()します。つまり、 と同じ値を返しますSystem.identityHashCode())

このような質問は 3 つありますが、渡される値とは何か、どのように取得するのかを説明している関連リソースが見つかりません。

編集: これが私のテストです。デフォルトでtoSting()は、hashCode()内部を使用して 16 進値に変換します。では、オブジェクトを渡すとき、これは渡される値ですか? または、Java は (渡される) すべてのオブジェクトを追跡して、参照の衝突が発生しないようにするために何をしますか?

Object o = new Object();
System.out.println(o);
System.out.println(o.toString()); //both prints same thing - java.lang.Object@10385c1
4

5 に答える 5

6

hashcode()Java の内部メモリ ストレージにはまったく関与していません。オブジェクトを表すことができる一意の値を返すことになっている単なるメソッドです。

たまたま、オブジェクトを表す一意の値を取得する良い方法は、その内部メモリ アドレスを使用することですそして、それが のデフォルトの実装ですhashcode()。しかし、がメモリ アドレスをhashcode() 使用するという事実は、 がメモリ アドレスを定義することを意味しませhashcode()

于 2012-06-16T04:32:14.540 に答える
2

しかし、取得したこの値は hashcode() メソッドを正しく使用しています (私のテストによると同じです)?

いいえ。

JSLから:

参照値 (多くの場合、単なる参照) は、これらのオブジェクトへのポインターであり、オブジェクトを参照しない特殊な null 参照です。

Harnessing Javaからこのページを読む

于 2012-06-16T04:15:05.917 に答える
2

Javaでのハッシュコードのデフォルトの実装はObject、オブジェクトのメモリ アドレスに基づいています。これは、参照でもあります。

これは、参照を取得するために呼び出されるという意味ではありませんhashCode()。これは起こりません。参照変数は、instantiation( ) からメモリ アドレスを取得した後、メモリ アドレスを保持するだけnew Whatever()です。実際、クラスの実装で hashcode() をオーバーライドして何か違うことをするのはよくあることです。

于 2012-06-16T04:15:14.527 に答える
2

hashCode()それが一意であるという要件や期待はありません。ID メソッドではありません。

ただし、JDK の多くは、if 、 thenを想定しています。a.equals(b)a.hashCode() == b.hashCode()

逆は決して期待されていません。つまり、!a.equals(b)それは必要ありませんa.hashCode() != b.hashCode()。ただし、通常そうでない場合は、パフォーマンスが低下します。言い換えれば、hashCode()衝突はほとんどないと予想されます。

クラスのデフォルトの実装hashCode()は、通常、メモリ アドレスを使用して を生成しますが、アドレスを返しません。また、これを行うための言語仕様の要件もありません。ObjecthashCode()

于 2012-06-16T18:57:50.690 に答える
1

参照渡しとは、実際に元のオブジェクト参照を渡すJava Objectsたびに渡すことを意味します。Objectハッシュコードは、そのオブジェクトに関連付けられたフィールド値に依存します。ハッシュコードは実際とは関係ありません。memory address.同じ値を持つ 2 つのオブジェクトが異なることは非常にまれですhashcode。2 つの異なるオブジェクトを作成しても、値が同じであっても、ハッシュコードは常に同じになります。ハッシュ関数がどれだけ効率的であるかによって異なります。

于 2012-06-16T04:39:00.733 に答える