Come funzionano hashCode () e identityHashCode () nel back-end?

Come funzionano Object.hashCode() e System.identityHashCode() nel back-end? identityHashCode() restituisce il riferimento dell’object? hashCode() dipende dal? dell’object? == operatore come lavorare nel back-end.

Qual è la differenza tra hashCode() e identityHashCode() ?

Come funzionano Object.hashCode () e System.identityHashCode () nel back-end?

Supponendo che non sia stato sovrascritto, il metodo Object.hashCode() chiama semplicemente System.identityHashCode(this) .

Il comportamento esatto di System.identityHashCode(Object) dipende dall’implementazione JVM. (L’implementazione effettiva delle JVM recenti di Hotspot è piuttosto intelligente, ma sto divagando.)

identityHashCode() restituisce il riferimento dell’object?

No. Restituisce un int e un int non può contenere un riferimento. (Duh!)

Il numero intero restituito da identityHashCode può essere correlato all’indirizzo (a) macchina per l’object o potrebbe non essere 1 . Il valore restituito da identityHashCode() è garantito che non cambia per la durata dell’object. Ciò significa che il GC sposta un object (dopo una chiamata identityHashCode() ) quindi non può utilizzare il nuovo indirizzo dell’object come codice hash dell’id quadro.

HashCode () dipende dal ? dell’object ? == ? == operatore come lavorare nel back-end.

Questo non ha senso. Non c’è ? == ? == o ?== operatore in Java.

Qual è la differenza tra hashCode () e identityHashCode ()?

Questo è in parte spiegato sopra. Altre differenze includono:

  • Il metodo hashcode() è un metodo di istanza non finale e deve essere sovrascritto in qualsiasi class in cui viene eseguito l’override di equals(Object) . Al contrario, identityHashCode(Object) è un metodo static e pertanto non può essere sovrascritto.

  • Il metodo identityHashCode(Object) fornisce un identificatore per un object che può (in teoria) essere utilizzato per altre cose rispetto alle tabelle hash e hash. (Sfortunatamente, non è un identificatore univoco , ma è garantito che non cambierà mai per la durata dell’object).


1 – Per le JVM di generazione corrente, non è affatto correlato all’indirizzo di memoria. Vedi la risposta di @ bestsss.

identityHashCode () funziona in questo modo ( e ora non ha nulla a che fare con l’indirizzo, specialmente perché gli indirizzi sono lunghi 64 bit, ok allineati, quindi 61 )

Controlla se ce n’è già generato uno, se così lo restituisce. Puoi supporre che ci sia un posto nell’intestazione dell’object per quell’int;

altrimenti: genera un numero casuale (algoritmo di spostamento Marsaglia shift-xor ), ogni thread nativo ha il proprio seme, quindi nessuna informazione condivisa. CAS il campo identityHashCode nell’intestazione dell’object per aggiornare w / il numero appena generato. se CAS successo restituisce il valore, in caso contrario – il campo contiene già identityHashCode generato.

puoi vedere il resto delle risposte riguardo l’hashcode che sovrascrive.

bottom line: se javadoc riporta ancora qualcosa sugli indirizzi e identityHashCode, qualcuno deve aggiornarlo.

Questo è praticamente l’implementazione specifica. L’unica garanzia che ottieni è

Per quanto ragionevolmente pratico, il metodo hashCode definito dalla class Object restituisce interi distinti per oggetti distinti. (Questo in genere viene implementato convertendo l’indirizzo interno dell’object in un numero intero, ma questa tecnica di implementazione non è richiesta dal linguaggio di programmazione Java TM .)

(Da Java 1.6 JavaDoc)

In teoria, ciò significa che i valori potrebbero essere determinati arbitrariamente e potrebbero anche essere zero per ogni object. In pratica, probabilmente è qualcosa derivato dall’indirizzo dell’object. Certo, devi stare attento a questo. La JVM può spostare gli oggetti se pensa che sia una buona idea durante una garbage collection, quindi non sarà “solo” l’indirizzo di memoria. Può essere estratto da un contatore globale o da un hash della posizione dell’object originale o da un generatore di numeri casuali, ecc.

identityHashCode

public static int identityHashCode (Object x)

Restituisce lo stesso codice hash per l’object dato come verrebbe restituito dal metodo predefinito hashCode () , indipendentemente dal fatto che la class dell’object sovrascriva hashCode (). Il codice hash per il riferimento null è zero.

Vedi [ documenti Java ]

Quindi, se qualcuno ha scavalcato il metodo hashCode() nella sua class ma desidera comunque il valore predefinito hashCode() che sarebbe stato restituito da Object hashCode() quindi usa System.identityHashCode()

Quindi, hashCode() chiama internamente System.identityHashCode() finché non lo si sovrascrive nella class, se si esegue l’override di hashCode () chiamerà la propria implementazione.