Sobes.tech
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é?

  • HashMap utilizza prima hashCode() 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).

Cosa succede se si tenta di inserire due oggetti in… - sobes.tech