Sono curioso di sapere come java genera valori hash utilizzando il metodo hashCode() dell'API dell'oggetto?come funziona il metodo hashCode() di java?
risposta
Java non genera hashCode(), ad esempio non accade nulla di automatico. Tuttavia, Object
genera un codice hash basato sull'indirizzo di memoria dell'istanza dell'oggetto. La maggior parte delle classi (specialmente se la si utilizzerà in una qualsiasi delle API Collection
) dovrebbe implementare il proprio HashCode (e contrattualizzare il proprio metodo di equals).
Il di Object
è in realtà un metodo nativo e l'implementazione non è in realtà pura Java. Ora, per quanto riguarda il come funziona, this answer from Tom Hawtin fa un grande lavoro a spiegarla:
Molte persone sostengono che
Object.hashCode
restituirà l'indirizzo della rappresentazione oggetto in memoria. Nelle implementazioni moderne gli oggetti si spostano effettivamente all'interno della memoria. Invece, viene utilizzata un'area dell'intestazione dell'oggetto per memorizzare il valore, che può essere derivato pigramente dall'indirizzo di memoria nel momento in cui il valore viene richiesto per la prima volta.
L'intera risposta vale davvero la lettura.
In base alla documentazione dell'API della piattaforma Java, il calcolo dell'hashcode si basa sull'indirizzo JVM interno a 32 bit dell'oggetto.
È vero che l'oggetto si sposta durante l'esecuzione (AFAIK l'unico motivo è Garbage Collector). Ma l'hashcode non cambia.
Quindi, quando si dispone di un oggetto come questo
Person person1 = new Person();
person1.setName("Alex");
Person person2 = new Person();
person2.setName("Alex");
Person person3 = person2;
In questo caso person1.hashCode non sarà uguale a person2.hashCode perché gli indirizzi di memoria di questi due oggetti non sono gli stessi.
Ma person2.hashCode sarà uguale a person3 perché punta allo stesso oggetto.
Quindi, se è necessario utilizzare il metodo hashCode per gli oggetti, è necessario implementarlo autonomamente.
A proposito: L'implementazione di string.hashCode è diversa. E 'qualcosa di simile: (C# sintassi)
public int hashCode(String str)
{
int h = 0;
for (int i = 0; i < str.Length; i++)
h = (h * 31) + str[i];
return h;
}
edit: Nessun controllo di overflow è fatto qui, in modo che il hashCode può essere positivo o negativo.
Java non genera significativo hashCode
per te, è il tuo lavoro come programmatore per generare un utile hashCode
. L'impostazione predefinita hashCode
è solo la posizione di memoria.
Preciso: l'hashcode predefinito si basa sulla posizione di memoria * la prima volta che il metodo viene chiamato * per l'oggetto; vedi @ risposta di Pascal. –
Buon punto, debitamente annotato. – fastcodejava
Object.hashCode() utilizza System.identityHashCode() che si basa su un numero ID per un dato oggetto.
La funzione HashCode() ha diverse opzioni per la creazione di un codice hash. Imposta il parametro di avvio JVM.Funzione, che creano hashCode() scritto su C++, e si può vedere il codice here
- HashCode == 0: restituisce semplicemente numeri casuali senza alcun rapporto con cui in memoria si trova l'oggetto. Per quanto posso capire, la lettura/scrittura globale del seme non è ottimale per i sistemi con molti processori .
- HashCode == 1: Conta i valori del codice hash, non è sicuro a quale valore iniziano, ma sembra piuttosto alto.
- HashCode == 2: Restituisce sempre lo stesso identico codice hash di identità di 1. Questo può essere utilizzato per testare il codice che si basa sull'identità dell'oggetto. Il motivo per cui JavaChampionTest ha restituito l'URL di Kirk nell'esempio sopra è che tutti gli oggetti restituivano lo stesso codice hash.
- HashCode == 3: Conta i valori del codice hash, a partire da zero. È non sembra essere thread-safe, quindi più thread possono generare oggetti con lo stesso codice hash.
- HashCode == 4: Questo sembra avere qualche relazione con la posizione di memoria in cui è stato creato l'oggetto.
- HashCode> = 5: Questo è l'algoritmo predefinito per Java 8 e ha un seme per-thread per-thread. Usa lo schema xor-shift di Marsaglia per produrre numeri pseudo-casuali .
Le informazioni intrapresa dal here
- 1. Come funziona il metodo equals() in Java
- 2. Cosa c'è dietro il metodo hashCode() per String in Java?
- 3. Deterministic hashCode() di java?
- 4. Come viene implementato il metodo hashCode() nella classe Object?
- 5. Quando utilizzare il metodo System.identityhashcode() e hashcode()?
- 6. Implementazione HashCode dell'array Java
- 7. Java librerie della piattaforma HashCode
- 8. Qual è lo scopo del metodo hashcode in java?
- 9. Implementazione hashCode() di Java Hashtable # rotta?
- 10. hashCode strategie di attuazione
- 11. modo esatto come funziona il metodo finale in java
- 12. Qual è l'uso di hashcode in Java?
- 13. Distribuzione del bucket Hashcode in java
- 14. metodo Java lambda di riferimento non funziona
- 15. Come funziona il metodo Take()?
- 16. Come funziona il metodo AuthorizeCore?
- 17. Come funziona il metodo setResponsePage() di Wicket?
- 18. Java - Il metodo hashCode() della classe Point è valido, o dovrei sovrascriverlo e scriverne uno mio?
- 19. Come generare stringhe che condividono lo stesso hashcode in Java?
- 20. Java non funziona come funziona?
- 21. Come usare hashCode originale() metodo dopo l'override si
- 22. Si consiglia di utilizzare hashcode per determinare l'uguaglianza in Java?
- 23. L'override del metodo hashCode() di Java non è necessario se non si utilizza hashmap o hashset
- 24. Il metodo Java funziona su Windows ma non su Macintosh?
- 25. Il metodo Java funziona in 1.5 ma non 1.6
- 26. metodo Java LibGDX BitmapFont setScale non funziona
- 27. Come funziona il metodo ASP.NET MVC UpdateModel()?
- 28. Come ottenere il riconoscimento del bug hashCode() URI Java che è stato negato in modo inappropriato
- 29. Kotlin: il riferimento al metodo non funziona?
- 30. HashCode vs SHA-1
Dal file Object.java '(Questo è tipicamente ** ** attuato convertendo l'indirizzo ** ** interna dell'oggetto in numero intero, ma questa implementazione la tecnica è ** non ** richiesta dal linguaggio di programmazione Java TM.) - Sottolineo la mia. –
Questo hashCode restituirà un valore diverso dopo che l'oggetto viene spostato quando si verifica GC? – Jacky
L'idea che hashCode usi l'indirizzo di memoria è un artefatto storico http://stackoverflow.com/questions/36236615/does-object-tostring-or-object-hashcode-ever-give-the-memory-address-of-the -obje – Raedwald