2013-02-28 5 views
40

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

+0

デフォルトのimplについてあなたは[this](http://blogs.tedneward.com/CommentView,guid,eca26c5e-307c-4b7c-931b-2eaf5b176e98.aspx)を読むことができます。 – CAMOBAP

+1

デフォルトの実装はJVM固有ですが、一般的に 'return Objects。ハッシュ(this.field1、this.field2、this.field3など); ' – NoName

答えて

38

このクラスは、その祖先の1人からhashCodeを継承します。それらのうちのどれかを上書きしないと、Object.hashCodeが使用されます。 docsから

合理的に実用的である限り、クラスオブジェクトによって定義されたhashCodeメソッドは、異なるオブジェクトの異なる整数値を返しません。 (これは、典型的には、整数にオブジェクトの内部アドレスを変換することによって実現されるが、この実装技術はのJavaTMプログラミング言語で必要とされない。)

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

+0

ありがとう、はい。 'Object.hashCode()look 'の実装はどんなものですか? –

+1

@JohnThreepwood実装の詳細ですから、そのためにJVMドキュメントを扱う必要があります。 –

+2

http://stackoverflow.com/a/32454673/6785908 –

3

オブジェクトです。 hashcode()はネイティブメソッドです。それは、プラットフォーム固有のコードで実装だとネイティブメソッドとして公開されることを意味

public native int hashCode();

。同じのため

コードがコンパイルされたコードと使用できませんwithing JDK

このexisting questionは、より多くの情報を提供するかもしれないだろう。

14

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

A進表現を介してtoString()のデフォルトの実装で使用されます。実行System.out.println(o1)

[email protected] 
+0

良い説明。 – chipmunk

関連する問題