どうやってObject.hashCode()
そしてSystem.identityHashCode()
バックエンドで動作しますか?identityHashCode()
オブジェクトの参照を返しますか?hashCode()
オブジェクトの内容またはアドレスに依存しますか?
hashCode()
との違いは何ですかidentityHashCode()
?
ベストアンサー1
Object.hashCode() と System.identityHashCode() はバックエンドでどのように機能しますか?
オーバーライドされていないと仮定すると、Object.hashCode()
メソッドは単に を呼び出しますSystem.identityHashCode(this)
。
の正確な動作はSystem.identityHashCode(Object)
JVM 実装によって異なります。(最近の Hotspot JVM の実際の実装はかなり巧妙ですが、それはさておき)。
identityHashCode()
オブジェクトの参照を返しますか?
いいえ。 を返しますint
が、 はint
参照を保持できません。
によって返される整数は、identityHashCode
オブジェクトの(a)マシンアドレスに関連している可能性があり、1ではない可能性があります。によって返される値は、identityHashCode()
変わらないことが保証されているオブジェクトの存続期間中。つまり、GC が (呼び出し後にidentityHashCode()
) オブジェクトを再配置した場合、新しいオブジェクトのアドレスを ID ハッシュコードとして使用することはできません。
hashCode() は、バックエンドでどのように動作するかという
?
オブジェクト演算子に依存します。? ==
これは意味をなさない。Javaには? ==
or?==
演算子がない。
hashCode() と identityHashCode() の違いは何ですか?
これは上記で部分的に説明しました。その他の違いは次のとおりです。
メソッド
hashCode()
は非final
インスタンス メソッドであり、 がequals(Object)
オーバーライドされるすべてのクラスでオーバーライドされる必要があります。対照的に、はメソッドidentityHashCode(Object)
であるstatic
ため、オーバーライドできません。この
identityHashCode(Object)
メソッドは、(理論上は)ハッシュやハッシュテーブル以外の用途にも使用できるオブジェクトの識別子を提供します。(残念ながら、個性的識別子ですが、はオブジェクトの存続期間中は決して変更されないことが保証されます。
1 - 現在の世代の JVM の場合、メモリ アドレスとはまったく関係ありません。@bestsss の回答を参照してください。