ホームページ  >  記事  >  Java  >  Java オブジェクトの「hashCode()」がオーバーライドされない場合、どうなりますか?

Java オブジェクトの「hashCode()」がオーバーライドされない場合、どうなりますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 01:38:02504ブラウズ

What Happens to Java Object's `hashCode()` When It's Not Overridden?

Java のハッシュ コードについて: オーバーライドされない場合のデフォルトの動作

Java では、 hashCode() メソッドがオブジェクトの一意の識別子を決定する際に重要な役割を果たします。固有のメソッドであるため、その動作は、オブジェクトのクラスによってオーバーライドされるかどうかによって異なります。そのままにした場合の hashCode() のデフォルトの実装を調べてみましょう。

オブジェクトのデフォルトのハッシュ コード生成

hashCode() メソッドがオーバーライドされていない場合、HotSpot JVM (広く使用されている実装) Java) は、オブジェクトのヘッダーに乱数を生成して格納するメカニズムを採用しています。後続の hashCode() の呼び出しでは、この乱数が単純に取得されます。この動作は、オブジェクトの内容や場所と相関関係を持たずに、オブジェクトに予測不可能で一意の識別子を提供するように設計されています。

ハッシュ コードの HotSpot JVM 構成

ハッシュ コードの生成戦略は制御可能です-XX:hashCode=n HotSpot JVM 経由オプション:

  • 0 (Java 7 のデフォルト): 競合状態や競合が発生しやすいグローバルランダムジェネレーターを使用します。
  • 5 (デフォルトJava 8 の場合): スレッドローカルの xor-shift ランダム ジェネレーターを使用し、以前のものを排除します。 issues.
  • 1: オブジェクト ポインタとランダム値を混合し、stop-the-world イベント間の安定性を提供します (テスト/デバッグ用)。
  • 2 : 常に 1 を返します (
  • 3: 自動インクリメント数値を使用します (競合の可能性があるテスト/デバッグ用)。
  • 4: トリミングされた数値を使用しますオブジェクト ポインタ (

-XX:hashCode=4 を指定しても生成されたハッシュ コードは、オブジェクトの再配置の可能性があるため、オブジェクトのメモリ アドレスを直接反映しない可能性があることに注意することが重要です。さらに、オブジェクトアドレスの分散が悪い場合、不均衡なハッシュテーブルが発生する可能性があります。

以上がJava オブジェクトの「hashCode()」がオーバーライドされない場合、どうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。