Aggiungendo alla risposta di @Lombo
Quando sarà necessario sovrascrivere equals ()?
L'implementazione predefinita di Object's equals () è
public boolean equals(Object obj) {
return (this == obj);
}
il che significa che due oggetti saranno considerati uguali solo se hanno lo stesso indirizzo di memoria, il che sarà vero solo se si confronta un oggetto con se stesso.
Ma potresti voler considerare due oggetti uguali se hanno lo stesso valore per una o più delle loro proprietà (fai riferimento all'esempio fornito nella risposta di @Lombo).
Quindi prevarrete equals()
in queste situazioni e dareste le vostre condizioni per l'uguaglianza.
Ho implementato con successo equals () e sta funzionando alla grande, quindi perché stanno chiedendo di sovrascrivere anche hashCode ()?
Bene, purché non utilizzi raccolte basate su "Hash" sulla tua classe definita dall'utente, va bene. Ma un po 'di tempo in futuro potresti voler usare HashMap
o HashSet
e se non lo fai override
e "implementi correttamente" hashCode () , queste raccolte basate su Hash non funzioneranno come previsto.
Sostituisci solo equivale (aggiunta alla risposta di @Lombo)
myMap.put(first,someValue)
myMap.contains(second); --> But it should be the same since the key are the same.But returns false!!! How?
Prima di tutto, HashMap controlla se l'hashCode di second
è lo stesso di first
. Solo se i valori sono gli stessi, procederà a verificare l'uguaglianza nello stesso bucket.
Ma qui hashCode è diverso per questi 2 oggetti (perché hanno un indirizzo di memoria diverso rispetto all'implementazione predefinita). Quindi non si preoccuperà nemmeno di verificare l'uguaglianza.
Se hai un punto di interruzione all'interno del tuo metodo overals (uguale a), non entrerebbe se avessero diversi hashCode.
contains()
controlla hashCode()
e solo se sono uguali chiamerebbe il tuo equals()
metodo.
Perché non possiamo fare in modo che HashMap controlli l'uguaglianza in tutti i bucket? Quindi non è necessario che io ignori hashCode () !!
Quindi ti manca il punto delle raccolte basate su hash. Considera quanto segue:
Your hashCode() implementation : intObject%9.
Di seguito sono riportate le chiavi memorizzate sotto forma di secchi.
Bucket 1 : 1,10,19,... (in thousands)
Bucket 2 : 2,20,29...
Bucket 3 : 3,21,30,...
...
Dì, vuoi sapere se la mappa contiene la chiave 10. Desideri cercare tutti i secchi? o Vorresti cercare un solo bucket?
Sulla base dell'hashCode, identificheresti che se è presente 10, deve essere presente nel Bucket 1. Quindi verrà cercato solo il Bucket 1 !!