ハッシュの概念は初めてですが、HashMap、HashTableなどがハッシュを使用していることを読みました。値を保存するときにキーを指定する必要があります
ただし、すべてのオブジェクトには hashCode() メソッドがあるため、java は、オブジェクトを管理する際に (リスト以外で) 特定のフィールドを介してオブジェクトの hashCode を内部的に使用します。
これは、 Object.hashCode()の javadoc によって回答されています。
合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は JavaTM プログラミング言語では必要ありません。)
(私のものを強調)
いいえ、hashCode を格納するための追加フィールドはありません (一部のクラスがそれをオーバーライドし、専用フィールドを使用して実装することを決定しない限り)。
また、hashCode は JVM では使用されませんが、ハッシュベースのコレクション (Hashtable、HashMap、HashSet など) によって使用されます。
「Java はバックグラウンドでオブジェクトを管理するためにJava を使用hashCode()
しますか?」と聞かれたら、答えは「いいえ」だと思います。hashCode()
;の本当に悪いオーバーライドを書いたらどうなるか考えてみてください。これによって JVM の内部が妨げられると思いますか?
いいえ、hashCode() メソッドは、オブジェクトのインスタンスに関連付けるために使用されるキーを定義するために使用されます。
オブジェクトの特定のインスタンスを識別するために使用され、Java オブジェクトの管理にハッシュ技術が使用されていることを意味するものではありません。
hashCode() メソッドをオーバーライドして、オブジェクトのインスタンスを識別するキーを割り当てる独自の方法を定義できます。
public native int hashCode();
hashCode
ネイティブ実装です。ただし、それに関連付けられているフィールドはありません。
This is typically implemented by converting the internal address of the
object into an integer, but this implementation technique is not required
by the JavaTM programming language.
OpenJDK/Oracle JVM では、最初のハッシュ コードを計算する通常の方法は、最初の要求時のメモリ アドレスに基づいています。オブジェクトはメモリ内を移動するため、毎回アドレスを使用するのは適切な選択ではありません。ハッシュ コードは実際のアドレスではありません。これは通常、8 の倍数であり、特に 2 のべき乗サイズのハッシュ テーブルで直接使用するには適していません。ID ハッシュ コードは一意ではないことに注意してください。
ドキュメントによると
jvmtiError GetObjectHashCode(jvmtiEnv* env, jobject object, jint* hash_code_ptr)
と
For the object indicated by object, return via hash_code_ptr a hash code.
This hash code could be used to maintain a hash table of object references,
however, on some implementations this can cause significant performance
impacts--in most cases tags will be a more efficient means of associating
information with objects. This function guarantees the same hash code value
for a particular object throughout its life.