ハッシュマップキーは不変オブジェクトであるか、少なくともマップ/セットからその値を適切に取得するための一貫したハッシュコードを持っている必要があることを私は知っています。しかし、ハッシュコードまたはequalsをオーバーライドせずに、変更オブジェクトをキーとして使用すると、そのハッシュコードはライフサイクルを考慮して一貫性がありますか。変化するオブジェクトのハッシュコードを取得しようとしましたが、常に一貫していることがわかりました。
4 に答える
Javaアプリケーションの実行中に同じオブジェクトで複数回呼び出される場合は常に、オブジェクトのequals比較で使用される情報が変更されていない限り、hashCodeメソッドは一貫して同じ整数を返す必要があります。
したがって、オブジェクトを変更してもハッシュコードが変更されないという保証はありません。一部のJDK実装は、ある種の内部アドレスを使用する場合がありますが、使用する必要はないため、それに依存しないでください。
最新バージョンのHotSpotJVMでは、オブジェクトのデフォルトのハッシュコードは時間の経過とともに変更されません。実際、ハッシュコードは初期割り当てアドレスから取得され、オブジェクトがガベージコレクターによって移動され、その後変更されないため、オブジェクトヘッダー( JVMホワイトペーパーを参照)に入力されます。
はい、hashCodeメソッドをオーバーライドしない場合は一定になります。デフォルトのhashCodeは、メモリ内のオブジェクトの元の場所です。このメモリ位置は、次の方法で取得されます。
System.identityHashCode(Object)
StackOverflowでこのスレッドをチェックしてください:
のデフォルトのJava実装はhashcode
オブジェクトへのポインタに基づいているため、インスタンス変数が変更されても変更されません。
編集
しかし、Martijnは私をそれに打ち負かしました。