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 restituiretrue. - Simmetria: per ogni coppia di oggetti non null
xey, sex.equals(y)restituiscetrue, alloray.equals(x)deve anche restituiretrue. - Transitività: per ogni trio di oggetti non null
x,yez, sex.equals(y)ey.equals(z)restituisconotrue, allorax.equals(z)deve anche restituiretrue. - Consistenza: per ogni coppia di oggetti non null
xey, le chiamate ripetute ax.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 restituirefalse.
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.
}