hashCode
メソッドをオーバーライドしない場合、hashCode
のデフォルトの実装は何ですか?
次に、このクラスは、その祖先の1つからhashCode
を継承します。それらのどれもがそれをオーバーライドする場合、 Object.hashCode が使用されます。
docs から:
合理的に実用的である限り、Objectクラスによって定義されたhashCodeメソッドは、個別のオブジェクトに対して個別の整数を返します。 (通常、これはオブジェクトの内部アドレスを整数に変換することで実装されますが、この実装手法はJavaTMプログラミング言語では必要ありません。)
デフォルトの実装はJVM固有です
デフォルトでは、オーバーライドされないメソッドはObject
から継承されます。
そのメソッドのドキュメントを見ると、戻り値は「[...] distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer [...])
」です。 _Java.lang.Object
_のメソッドはネイティブとして宣言されています。つまり、実装はJVMによって提供され、ランタイム環境によって異なる場合があります。
小さな例:
_Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.hashCode());
System.out.println(o2.hashCode());
_
印刷(私のjdk6を使用):
_1660187542
516992923
_
hashCode()
値の16進表現は、toString()
のデフォルトの実装で使用されます:System.out.println(o1)
を実行すると、
_Java.lang.Object@7a5e1077
_
Object.hashcode()はネイティブメソッドです。
public native int hashCode();
つまり、プラットフォーム固有のコードで実装され、ネイティブメソッドとして公開されます。
同じためのコードはコンパイルされたコードであり、JDKでは利用できません
これ 既存の質問 により詳しい情報が提供される場合があります。