この質問がインタビューで尋ねられ、私はこれを言ったので少し混乱しています:
しかし、インタビューは次のように述べています:「オブジェクトでハッシュコードメソッドを呼び出すと生成されます」
さらに、私はハッシュコード(およびそれはJavaにも当てはまります)をより深く理解しようとしています。いくつかの就職の面接で広範に尋ねられるので、いくつかのリンク/ソースを共有してください
PS: オブジェクトに対して sysout... を実行すると、出力は employee@942f533 になります。
ここで何を意味するかによって異なります。他の回答が述べたように、関数自体は作成時に呼び出されません。でも、
90 * As much as is reasonably practical, the hashCode method defined by
91 * class {@code Object} does return distinct integers for distinct
92 * objects. (This is typically implemented by converting the internal
93 * address of the object into an integer, but this implementation
94 * technique is not required by the ... [JDK]
http://www.docjar.com/html/api/java/lang/Object.java.htmlから
オブジェクトのアドレスは作成時に割り当てられるため、ある意味では正しいです。ただし、これは必須ではなく、多くのオブジェクトでオーバーライドが定義されているため、必ずしもすべてのオブジェクトに当てはまるとは限りません。
通常、面接では、自分の言いたいことを説明するために面接官に少し挑戦する必要があります。これを行って正しく、問題が解決したことになります。これを行って、間違っていた場合、少なくとも、元のステートメントよりも深い理解を示したことになります。
hashcode() は、他のメソッドと同様のメソッドです。オブジェクトが作成されたときに呼び出されることはありません。オブジェクトをマップに配置するときに呼び出される場合があります。
最初に読むべきドキュメントは次のとおりだと思います: http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode ()
実際には、理解するにはハッシュ コードの使用法を理解する必要があります。
オブジェクトの作成時ではなく、 hashCode() が呼び出されたときにハッシュコードが生成されます。
オブジェクトごとに、java.lang.Object のハッシュ コードのデフォルトの実装をオーバーライドしたくない場合があります。内部でハッシュアルゴリズムを使用しているすべてのクラスに実際に必要です。例: HashMap、HashSet など。これらのメソッドの内部実装を調べてみると、ハッシュ コードなどの使用法がわかります。
java.util.HashMap からのコード スニペット:
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
ご覧のとおり、データ構造から適切なオブジェクトを取得するために使用されます。
オブジェクトハッシュコードのコメントを確認すると、これについても明確に言及されています
* Returns a hash code value for the object. This method is
* supported for the benefit of hashtables such as those provided by
* <code>java.util.Hashtable</code>.