2010-09-17 13 views
10

Sono curioso di sapere perchè Object.toString() restituisce questo:Perché l'oggetto Object.toString() predefinito restituisce una rappresentazione esadecimale del codice hash?

return getClass().getName() + "@" + Integer.toHexString(hashCode()); 

al contrario di questo:

return getClass().getName() + "@" + hashCode(); 

Quali sono i vantaggi che visualizza il codice hash come un esagono, piuttosto che un numero decimale si acquista?

+0

Strettamente correlato a http://stackoverflow.com/questions/29140402/how-do-i-print-my-java-object-without-getting-sometype2f92e0f4 – Raedwald

risposta

9

Object.hashCode utilizzato per essere calcolato based on a memory location where the object is located. Le posizioni di memoria sono quasi universalmente visualizzate come esadecimali.

Il valore di ritorno predefinito di toString non interessa tanto il codice hash ma piuttosto un modo per identificare univocamente l'oggetto a scopo di debug e il codice hash serve bene allo scopo di identificazione (infatti , la combinazione di nome classe + indirizzo di memoria è davvero unica e, sebbene non sia garantito che un codice hash sia univoco, spesso si avvicina).

+12

in senso stretto 'Object.hashCode()', restituisce un numero che * per alcune JVM * è basato sulla posizione dell'oggetto * nel momento in cui il metodo viene chiamato per la prima volta *. Il GC può spostare l'oggetto, ma 'hashCode' deve rimanere lo stesso. –

+4

Esistono di fatto ** eventuali ** JVM per i quali restituisce la posizione di memoria? – Raedwald

+3

L'affermazione che "' Object.hashCode' di default restituisce un indirizzo di memoria" è sbagliato per tutte le JVM Sun/Oracle rilasciati negli ultimi dieci anni, c.f. http://stackoverflow.com/questions/16105420/java-object-hashcode-address-or-random/16105878#16105878. Avevi in ​​mente altre implementazioni JVM o intendevi dire che l'hashCode ** è stato usato per ** restituire una posizione di memoria? – meriton

9

non mi piace la risposta accettata. Ecco la mia risposta.

Risposta breve: perché esadecimale è più facile da memorizzare, dal momento che un numero espresso in esadecimale è più corto e ha una varietà di caratteri più grande lo stesso numero espresso in decimali.

Più rispondere: non si ha intenzione di utilizzare il codice hash di fare aritmetica con esso nella tua testa, in modo che non si ha realmente bisogno di essere in decimale. D'altra parte, è molto probabile che lo si utilizzi nel solo modo in cui è destinato ad essere utilizzato, cioè per dire se due codici hash si riferiscono allo stesso oggetto o a oggetti diversi. In altre parole, lo utilizzerai come identificativo univoco o mnemonico per un oggetto. Quindi, il fatto che sia un numero è irrilevante; potresti anche pensarlo come una stringa di hash. Bene, è proprio così che il nostro cervello trova molto più semplice conservare (a scopo di confronto) le stringhe corte composte da 16 caratteri diversi, rispetto a stringhe più lunghe composte da soli 10 caratteri diversi.

+3

In una nota correlata, se i numeri sono stati visualizzati in decimale, le persone potrebbero essere più inclini ad aspettarsi che "significino" qualcosa. Ad esempio, "Fnord # 194" suona molto più come il 194 ° Fnord di "Fnord @ 159C8EA5". Da un punto di vista mnemonico, altre codifiche alfanumeriche avrebbero potuto essere più brevi e più facilmente distinguibili, ma credo che Java volesse evitare qualsiasi possibilità di produrre sequenze di lettere che potessero essere considerate offensive. – supercat

+0

Lo usiamo solo per questo scopo. Ho bisogno di sapere (in tempesta) quale persistenza del nostro 5 persiste quale importo. Quindi nel nostro logging usiamo questo per ordinare su una singola istanza di un bullone. – markthegrea

Problemi correlati