In genere l'implementazione predefinita di Object.hashCode()
è una funzione dell'ubicazione assegnata dell'oggetto in memoria (sebbene ciò non sia richiesto dallo JLS). Dato che la VM smuove gli oggetti in memoria, perché il valore restituito da System.identityHashCode()
non cambia mai durante la vita dell'oggetto?In che modo JVM garantisce che System.identityHashCode() non cambierà mai?
Se si tratta di un calcolo "one-shot" (dell'oggetto hashCode
viene calcolato una volta e nascosto nell'intestazione oggetto o qualcosa del genere), allora vuol dire che è possibile per due oggetti hanno la stessa identityHashCode
(se capita essere prima assegnato allo stesso indirizzo in memoria)?
Domanda correlata: la memoria è indirizzata a un indirizzo di memoria reale oa qualcosa di virtuale che può rimanere fisso anche quando l'oggetto viene mescolato?Se virtuale, sarebbe bello perché i puntatori a questo non avrebbero bisogno di essere regolati. D'altra parte, ciò significherebbe un'ulteriore indiretta e una tabella di mappatura potenzialmente grande. – Thilo
È un leggero riarrangiamento dell'indirizzo quando richiesto per la prima volta. (Il ritorno di un codice hash con bit bassi a zero non è eccezionale.) –
In realtà, dove dice che identityHashCode non deve mai cambiare? JavaDoc per System.identityHashCode non è chiaro su questo. – Thilo