L'ultimo paragrafo del punto 9 di Effective Java, secondo Edn, J. Bloch dice che, per le classi di valore come Integer
, String
, Date
ecc, ritorno in funzione del valore esatto di tale classe come il non è una buona idea.Perché il valore di una classe di valori come hashCode "non è una buona idea"?
Quindi, la classe Integer
restituisce il value
del numero intero che rappresenta come hashCode
della sua istanza non è tutto così buono.
Né è la hashCode()
di String
restituendo un valore intero mappato direttamente dal contenuto globale, cioè, i caratteri che l'istanza String
contiene.
Questi hashCode()
-s sono chiaramente conformi al contratto.
Per me, sembra essere una buona idea, piuttosto che una cattiva tra-- le hashCode
-s variano i valori variano tra gli oggetti, e questi hashCodes
sono "normalizzati" prima di essere distribuiti nei secchi di un HashMap
/HashSet
- in modo che le hashCode
-s delle voci non costituiscono un pregiudizio su cui secchio voce andrà in
Cosa mi manca qui -. ciò che rende la mappatura del valore di classe direttamente a hashCode
un "cattivo idea"?
TIA
// ===========================
EDIT
pls anche vedere commenti sotto la risposta di Steve Siebert in relazione a questo.
d'accordo. ma la soluzione a questo dovrebbe forzare un principio che "il' hashCode' shdn't essere usato come un indicatore/sostituto funzionale di 'value'", piuttosto di entrare tra quella bella relazione tra 'valore' e' hashCode() 'e quindi tra' equals() 'e' hashCode() '. – Roam
Sono assolutamente d'accordo con te, un hashCode può in pratica essere trattato come uno che restituisce una rappresentazione "meno intelligente/lossy" del valore reale dell'oggetto - suscettibile al paradosso del compleanno. Ma, in realtà, un hash non è necessario * bisogno * di avere una relazione con valore ... hashCode ha bisogno di restituire sempre lo stesso valore int per lo stesso oggetto (tuttavia questo è definito da te) in modo che l'oggetto possa essere trovato in il secchio atteso. Normalmente questo viene fatto tagliando uno/più valori dell'oggetto ... ha senso. Ma, se si potesse fare, dica ... magia ... allora chi sono io per giudicare? =) –
aggrappando 'hashCode' a' value' è probabile che assicuri "se due oggetti non sono uguali, di quanto non lo siano i loro hashCode" e questa è una buona cosa avere per voci distribuite uniformemente tra i bucket hash-- sebbene non sia un requisito dal contratto. non ho visto né posso pensare a un modo migliore di farlo. – Roam