2013-02-28 13 views
40

Se uno non sovrascrive il metodo hashCode, qual è l'implementazione predefinita di hashCode?Qual è l'implementazione predefinita di `hashCode`?

+0

Informazioni sull'imp di default ementation puoi leggere [this] (http://blogs.tedneward.com/CommentView,guid,eca26c5e-307c-4b7c-931b-2eaf5b176e98.aspx) – CAMOBAP

+1

l'implementazione predefinita è specifica JVM, ma in generale restituisce 'return Objects. hash (this.field1, this.field2, this.field3, ecc.); ' – NoName

risposta

38

Quindi questa classe eredita hashCode da uno dei suoi antenati. Se non lo sostituisce, viene utilizzato Object.hashCode.

Dal docs:

Per quanto ragionevolmente possibile, il metodo hashCode definito dalla classe Object non ritorno interi distinti per oggetti distinti. (Questo è tipicamente implementato convertendo l'indirizzo interno dell'oggetto in numero intero, ma questa tecnica attuazione non è richiesta dal linguaggio di programmazione JavaTM.)

Quindi predefinito attuazione è specifica JVM

+0

Grazie, sì. Che aspetto ha l'implementazione di 'Object.hashCode()? –

+1

@JohnThreepwood è un dettaglio di implementazione, è necessario indirizzare i documenti JVM per quello. –

+2

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

3

oggetto. hashcode() è un metodo nativo.

public native int hashCode();

Ciò significa che è implementato in codice specifico della piattaforma ed è esposto come un metodo nativo.

codice

per lo stesso sarà un codice compilato e non è disponibile withing JDK

questo existing question potrebbe fornire ulteriori informazioni.

14

Per impostazione predefinita, i metodi non sovrascritti vengono ereditati da Object.

Se si guarda la documentazione del metodo, i valori di ritorno sono "[...] distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer [...])". Il metodo in java.lang.Object viene dichiarato come nativo, il che significa che l'implementazione viene fornita dalla JVM e può variare a seconda del proprio ambiente di runtime.

Un piccolo esempio:

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

stampe (usando il mio JDK6):

1660187542 
516992923 

rappresentazione un esagono del valore hashCode() è utilizzato nella implementazione predefinita di toString() a proposito: Running System.out.println(o1) stampa qualcosa come

[email protected] 
+0

Buona spiegazione. – chipmunk

Problemi correlati