ホームページ  >  記事  >  Java  >  「hashCode()」がオーバーライドされていない場合、Java はどのようにハッシュ コードを生成しますか?

「hashCode()」がオーバーライドされていない場合、Java はどのようにハッシュ コードを生成しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-31 21:17:02438ブラウズ

How Does Java Generate Hash Codes When `hashCode()` is Not Overridden?

Java のデフォルトのハッシュ コードの動作

hashCode() メソッドがオーバーライドされていない場合、Java のオブジェクトに対してこのメ​​ソッドを呼び出すと、システムが生成されます。 -生成されたハッシュ コード。

基礎となるメカニズム

HotSpot JVM では、通常、ハッシュ コードは次のいずれかの方法で決定されます。

  • 乱数 (Java 7 のデフォルト): 乱数が生成され、オブジェクト ヘッダーに格納されます。このデフォルトのアプローチでは、高度な同時実行環境で競合状態や遅延が発生する可能性があります。
  • スレッドローカルランダムジェネレーター (Java 8 のデフォルト): スレッドローカルランダムジェネレーターは、次の目的で使用されます。競合状態を回避し、パフォーマンスを向上させます。
  • オブジェクト ポインター: オブジェクト ポインターは、ハッシュ コードを生成するためにランダムな値と混合されます。ただし、この方法では、ハッシュ テーブルの分散が不十分になる可能性があります。

制御可能な動作

ハッシュ コード生成の動作は、-XX を使用して変更できます。 hashCode=n HotSpot JVM オプション。次の値が使用可能です:

  • 0 (Java 7 のデフォルト): グローバルランダムジェネレーター
  • 5 (Java 8 のデフォルト): スレッドローカル xor シフトランダムジェネレーター
  • 1: ランダムな値と混合されたオブジェクト ポインター
  • 2: 常に 1
  • 3: 自動インクリメント数値
  • 4: 32 ビットにトリミングされたオブジェクト ポインター

-XX:hashCode=4 オプションを使用する場合でも、オブジェクトが移動する可能性があるため、ハッシュ コードがオブジェクト アドレスに必ずしも対応するとは限らないことに注意することが重要です。

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

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