1

ハッシュマップキーは不変オブジェクトであるか、少なくともマップ/セットからその値を適切に取得するための一貫したハッシュコードを持っている必要があることを私は知っています。しかし、ハッシュコードまたはequalsをオーバーライドせずに、変更オブジェクトをキーとして使用すると、そのハッシュコードはライフサイクルを考慮して一貫性がありますか。変化するオブジェクトのハッシュコードを取得しようとしましたが、常に一貫していることがわかりました。

4

4 に答える 4

4

州の契約:hashcode

Javaアプリケーションの実行中に同じオブジェクトで複数回呼び出される場合は常に、オブジェクトのequals比較で使用される情報が変更されていない限り、hashCodeメソッドは一貫して同じ整数を返す必要があります。

したがって、オブジェクトを変更してもハッシュコードが変更されないという保証はありません。一部のJDK実装は、ある種の内部アドレスを使用する場合がありますが、使用する必要はないため、それに依存しないでください。

于 2012-08-04T09:05:46.280 に答える
3

最新バージョンのHotSpotJVMでは、オブジェクトのデフォルトのハッシュコードは時間の経過とともに変更されません。実際、ハッシュコードは初期割り当てアドレスから取得され、オブジェクトがガベージコレクターによって移動され、その後変更されないため、オブジェクトヘッダー( JVMホワイトペーパーを参照)に入力されます。

于 2012-08-04T09:06:54.463 に答える
0

はい、hashCodeメソッドをオーバーライドしない場合は一定になります。デフォルトのhashCodeは、メモリ内のオブジェクトの元の場所です。このメモリ位置は、次の方法で取得されます。

System.identityHashCode(Object)

StackOverflowでこのスレッドをチェックしてください:

JVMは、System.identityHashCode()が決して変更されないことをどのように保証しますか?

于 2012-08-04T08:58:44.650 に答える
0

のデフォルトのJava実装はhashcodeオブジェクトへのポインタに基づいているため、インスタンス変数が変更されても変更されません。

編集

しかし、Martijnは私をそれに打ち負かしました。

于 2012-08-04T09:00:48.893 に答える