Sobes.tech
Junior

Cosa fa il metodo equals() in Java?

sobes.tech AI

Risposta dell'AI

Il metodo equals() in Java viene utilizzato per confrontare due oggetti per uguaglianza. Per impostazione predefinita, nel caso di oggetti che ereditano da Object senza essere sovrascritti, confronta i riferimenti degli oggetti (==), cioè verifica se le variabili puntano alla stessa posizione di memoria.

Sovrascrivere correttamente il metodo equals() è importante per confrontare gli oggetti in base al loro contenuto, non alla loro posizione in memoria.

Quando si sovrascrive equals(), si devono seguire le seguenti regole:

  • Riflessività: per ogni oggetto non nullo x, x.equals(x) deve restituire true.
  • Simmetria: per ogni coppia di oggetti non null x e y, se x.equals(y) restituisce true, allora y.equals(x) deve anche restituire true.
  • Transitività: per ogni trio di oggetti non null x, y e z, se x.equals(y) e y.equals(z) restituiscono true, allora x.equals(z) deve anche restituire true.
  • Consistenza: per ogni coppia di oggetti non null x e y, le chiamate ripetute a x.equals(y) devono restituire sempre lo stesso risultato, a condizione che le informazioni usate per il confronto non cambino.
  • Per ogni oggetto non nullo x, x.equals(null) deve restituire false.

In genere, quando si sovrascrive equals(), si dovrebbe anche sovrascrivere il metodo hashCode(), rispettando il contratto: se due oggetti sono uguali secondo equals(), i loro hash code, restituiti da hashCode(), devono essere uguali. Il contrario non è obbligatorio: se gli hash code sono uguali, gli oggetti non devono necessariamente essere uguali.

Esempio di sovrascrittura:

public class MyObject {
    private int value;
    private String name;

    public MyObject(int value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        // Confronto stesso
        if (this == o) return true;
        // Controllo null e tipo dell'oggetto
        if (o == null || getClass() != o.getClass()) return false;
        // Cast e confronto dei campi
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // Generazione del codice hash basato sui campi
        return Objects.hash(value, name);
    }

    // getter, setter, ecc.
}