Perché Object.toString () predefinito restituisce una rappresentazione esadecimale di hashCode?

Sono curioso del perché Object.toString() restituisce questo:

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

al contrario di questo:

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

Quali vantaggi offre l’hash code come esadecimale anziché decimale?

Object.hashCode utilizzato per essere calcolato in base a una posizione di memoria in cui si trova l’object . Le posizioni di memoria sono quasi universalmente visualizzate come esadecimali.

Il valore di ritorno predefinito di toString non è tanto interessato al codice hash, ma piuttosto al modo di identificare univocamente l’object allo scopo di eseguire il debug, e il codice hash serve bene allo scopo di identificazione (in effetti, la combinazione di il nome della class + l’indirizzo di memoria è veramente unico, e mentre un codice hash non è garantito come univoco, spesso si avvicina).

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

Risposta breve: poiché esadecimale è più facile da memorizzare, poiché un numero express in esadecimale è più corto e ha una varietà di caratteri più ampia rispetto allo stesso numero express in decimale.

Risposta più lunga: non utilizzerai il codice hash per fare aritmetica con esso nella tua testa, quindi non hai davvero bisogno che sia 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 object o a oggetti diversi. In altre parole, lo utilizzerai come identificatore univoco o mnemonico per un object. 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.