Object.hashCode
これらのメソッド (およびSystem.identityHashCode
) は、オブジェクトのアドレス、またはアドレスからすばやく計算されたものを返すとよく耳にします。しかし、ガベージコレクターがオブジェクトを移動して圧縮することも確信しています。ハッシュ コードは変更できないため、これが問題になります。これは日常業務で知る必要がないことはわかっていますが、内部を理解したいと思います。それで、これがJavaでどのように実装されているか知っている人はいますか? または .NET です。おそらく似ているからです。
3 に答える
.NET の実装は意図的に公開されていません (逆コンパイルしようとすると、アンマネージ フレームワーク呼び出しが行われることがわかります)。そのような唯一のドキュメントはhereであり、「各オブジェクトに対して異なる値を生成することが保証されていない」こと、および「フレームワークのバージョン間で変更される可能性がある」ことのみを述べています。それが実際にどのように機能するかについて仮定を立てることは、おそらく賢明ではありません。
Java の方がよく理解されており (おそらく JVM によって異なる可能性があります)、具体的には次の質問で説明されています。
Java 実装の要点は、契約により、オブジェクトのハッシュコードの値は、最初に取得されるまで関係がないということです。その後、それは一定のままでなければなりません。したがって、オブジェクトを移動する GC は、オブジェクトの hashcode() メソッドが初めて呼び出されるまで問題になりません。その後、キャッシュされた値が使用されます。
オブジェクトの identityHashCode は変更されません。したがって、移動はそのレベルの下で行われます。
初歩的な実装では、すべてのオブジェクトに対して論理アドレス --> 物理アドレスのマッピングがあります。
より洗練された実装では、ページ レベルでのマッピングしか持たないため、おそらく最後の 6 ビットがメモリ オフセットで、残りがページ ID です。間接化は、ページ ID --> 実際のページ アドレス レベルで発生します。
.net では、getHash() メソッドは GC の影響を受けるため、開発者は独自のハッシュ実装を使用することをお勧めします。現時点では、内部実装へのリンクが見つかりません。後で見つけたら載せます..
リンクを見つけました...この質問はここで回答されました