Middle
Quali sono le regole per i metodi equals e hashCode?
sobes.tech AI
Risposta dell'AI
- Se due oggetti sono uguali secondo il metodo
equals(Object), i loro codici hash (ritornati dal metodohashCode()) devono essere uguali. - Se due oggetti non sono uguali secondo il metodo
equals(Object), i loro codici hash possono essere uguali o diversi. È buona pratica garantire codici hash diversi per oggetti non uguali per migliorare le prestazioni delle collezioni basate su hash. - Il metodo
hashCode()deve restituire valori uguali per lo stesso oggetto in chiamate multiple, a condizione che le informazioni usate per calcolare il hash non siano cambiate. - Simmetria: per qualsiasi oggetto
aeb, sea.equals(b)ètrue, allorab.equals(a)deve essere anch'essotrue. - Riflessività: per ogni oggetto non nullo
a,a.equals(a)deve esseretrue. - Transitività: per qualsiasi oggetto
a,bec, sea.equals(b)ètrueeb.equals(c)ètrue, alloraa.equals(c)deve esseretrue. - Coerenza: per qualsiasi oggetto non nullo
aeb, le chiamate multiple aa.equals(b)devono restituire coerentementetrueofalse, a condizione che le informazioni usate nei confrontiequals(Object)non siano cambiate.
Esempio di implementazione:
public class MyClass {
private int value;
private String name;
public MyClass(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public boolean equals(Object o) {
// Verifica identità oggetto
if (this == o) {
return true;
}
// Verifica tipo oggetto
if (o == null || getClass() != o.getClass()) {
return false;
}
// Cast
MyClass myClass = (MyClass) o;
// Confronto campi
return value == myClass.value &&
Objects.equals(name, myClass.name); // Uso di Objects.equals per null
}
@Override
public int hashCode() {
// Uso di Objects.hash
return Objects.hash(value, name);
}
// Altri metodi...
}