Junior — Middle
Cosa succede se si tenta di inserire due oggetti in una HashMap, considerandoli uguali per equals, ma con valori hashCode diversi?
sobes.tech AI
Risposta dell'AI
Se due oggetti sono considerati uguali dal metodo equals(), ma hanno valori diversi di hashCode(), il comportamento nell'inserimento in una HashMap sarà scorretto.
Perché?
HashMaputilizza primahashCode()per determinare il contenitore (bucket) in cui inserire l'oggetto.- Poi, all'interno del contenitore, confronta gli oggetti tramite
equals()per verificare l'uguaglianza.
Se hashCode() di oggetti uguali è diverso, finiranno in contenitori diversi, e HashMap non potrà rilevare che la chiave esiste già.
In breve:
- Potrebbero comparire duplicati di chiavi in
HashMap, violando il contratto della collezione. - La ricerca per chiave potrebbe non trovare l'oggetto, anche se esiste, perché
hashCode()non corrisponde.
Esempio:
class Key {
private int id;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Key)) return false;
Key key = (Key) o;
return id == key.id;
}
@Override
public int hashCode() {
return id + 1; // Errore: per oggetti uguali, hashCode deve essere uguale
}
}
Se equals considera due oggetti uguali (ad esempio, id=1), ma hashCode restituisce valori diversi, HashMap non funzionerà correttamente.
Perciò, è importante rispettare il contratto: se equals(a, b) == true, allora hashCode(a) == hashCode(b).