Sobes.tech
Middle

Quali sono le regole per i metodi equals e hashCode?

sobes.tech AI

Risposta dell'AI

  1. Se due oggetti sono uguali secondo il metodo equals(Object), i loro codici hash (ritornati dal metodo hashCode()) devono essere uguali.
  2. 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.
  3. 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.
  4. Simmetria: per qualsiasi oggetto a e b, se a.equals(b) è true, allora b.equals(a) deve essere anch'esso true.
  5. Riflessività: per ogni oggetto non nullo a, a.equals(a) deve essere true.
  6. Transitività: per qualsiasi oggetto a, b e c, se a.equals(b) è true e b.equals(c) è true, allora a.equals(c) deve essere true.
  7. Coerenza: per qualsiasi oggetto non nullo a e b, le chiamate multiple a a.equals(b) devono restituire coerentemente true o false, a condizione che le informazioni usate nei confronti equals(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...
}