2013-02-28 17 views
40

Jeśli nie zastąpisz metody hashCode, jaka jest domyślna implementacja hashCode?Co to jest domyślna implementacja `hashCode`?

+0

Informacje o domyślnej impozycji ementation można przeczytać [this] (http://blogs.tedneward.com/CommentView,guid,eca26c5e-307c-4b7c-931b-2eaf5b176e98.aspx) – CAMOBAP

+1

domyślna implementacja jest specyficzna dla JVM, ale generalnie zwraca 'Return Objects. hash (this.field1, this.field2, this.field3, itp.); ' – NoName

Odpowiedz

38

Następnie ta klasa dziedziczy hashCode od jednego z jej przodków. Jeśli nie nadpisuje go żaden z nich, wówczas zostanie użyty Object.hashCode.

Z docs:

O ile jest to uzasadnione i praktyczny sposób hashCode określa klasa obiektu nie powraca różne liczby całkowite dla różnych przedmiotów. (Jest to zwykle realizowane poprzez przekształcenie wewnętrzny adres obiektu do liczby całkowitej, ale technika ta realizacja nie jest wymagane przez język programowania JavaTM.)

Więc domyślna implementacja jest JVM specyficzne

+0

Dziękuję, tak. Jak wygląda wygląd 'Object.hashCode()? –

+1

@JohnThreepwood to szczegół implementacji, musisz zaadresować to do dokumentów JVM. –

+2

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

3

obiektu. hashcode() jest natywną metodą.

public native int hashCode();

Oznacza to, że jest to realizowane w kodzie konkretnej platformy i jest narażony jako native metody.

kod

za samo będzie skompilowany kod i nie są dostępne withing JDK

tym existing question może dostarczyć więcej informacji.

14

Domyślnie metody, które nie są przerywane, są dziedziczone po Object.

Jeśli przyjrzeć się dokumentacji tej metody, zwrócone wartości to "[...] distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer [...])". Metoda z zakresu java.lang.Object jest zadeklarowana jako natywna, co oznacza, że ​​implementacja jest zapewniona przez maszynę JVM i może się różnić w zależności od środowiska wykonawczego.

Mały przykład:

Object o1 = new Object(); 
Object o2 = new Object(); 
System.out.println(o1.hashCode()); 
System.out.println(o2.hashCode()); 

drukuje (używając mojego JDK6):

1660187542 
516992923 

Rozmiar A reprezentacja wartości hashCode() jest stosowany w realizacji domyślnej toString() przy okazji: Bieganie System.out.println(o1) drukuje coś w rodzaju:

[email protected] 
+0

Dobre wyjaśnienie. – chipmunk