web-dev-qa-db-ja.com

`hashCode`のデフォルトの実装は何ですか?

hashCodeメソッドをオーバーライドしない場合、hashCodeのデフォルトの実装は何ですか?

54
John Threepwood

次に、このクラスは、その祖先の1つからhashCodeを継承します。それらのどれもがそれをオーバーライドする場合、 Object.hashCode が使用されます。

docs から:

合理的に実用的である限り、Objectクラスによって定義されたhashCodeメソッドは、個別のオブジェクトに対して個別の整数を返します。 (通常、これはオブジェクトの内部アドレスを整数に変換することで実装されますが、この実装手法はJavaTMプログラミング言語では必要ありません。)

デフォルトの実装はJVM固有です

49
default locale

デフォルトでは、オーバーライドされないメソッドは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
_
15
f1sh

Object.hashcode()はネイティブメソッドです。

public native int hashCode();

つまり、プラットフォーム固有のコードで実装され、ネイティブメソッドとして公開されます。

同じためのコードはコンパイルされたコードであり、JDKでは利用できません

これ 既存の質問 により詳しい情報が提供される場合があります。

4
TheWhiteRabbit