Sobes.tech
Middle

Parla dei contratti dei metodi equals e hashCode in Java.

sobes.tech AI

Risposta dell'AI

  • Riflessività: per qualsiasi valore di riferimento diverso da zero x, x.equals(x) deve restituire true.

  • Simmetria: per qualsiasi coppia di valori di riferimento diversi da zero x e y, x.equals(y) deve restituire true se e solo se y.equals(x) restituisce true.

  • Transitività: per qualsiasi tripla di valori di riferimento diversi da zero x, y e z, se x.equals(y) restituisce true e y.equals(z) restituisce true, allora x.equals(z) deve restituire true.

  • Coerenza: per qualsiasi coppia di valori di riferimento diversi da zero x e y, le chiamate multiple a x.equals(y) devono restituire costantemente true o costantemente false, a condizione che nessuna informazione usata nei confronti equals degli oggetti venga modificata tra le chiamate.

  • Per qualsiasi valore di riferimento diverso da zero x, x.equals(null) deve restituire false.

  • Se due oggetti sono uguali secondo il metodo equals(Object), allora la chiamata al metodo hashCode per entrambi gli oggetti deve restituire lo stesso valore intero.

  • Non è necessario che, se due oggetti sono diversi secondo il metodo equals(java.lang.Object), la chiamata al metodo hashCode per entrambi gli oggetti restituisca valori interi diversi. Tuttavia, il programmatore deve capire che generare hash code diversi per oggetti non uguali può migliorare le prestazioni delle tabelle hash.

È importante ridefinire entrambi i metodi equals e hashCode se uno di essi viene ridefinito, per mantenere il contratto. L'uso di equals senza ridefinire hashCode può portare a un funzionamento errato delle collezioni che usano l'hash (ad esempio, HashMap, HashSet).

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // Riflessività
        if (o == null || getClass() != o.getClass()) return false; // Controllo null e tipo
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Confronto per contenuto
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Generazione hash basata sui campi
    }
}