Sobes.tech
Middle

Vertel over de contracten van de methods equals en hashCode in Java.

sobes.tech AI

Antwoord van AI

  • Reflectiviteit: voor elke niet-nul referentiewaarde x, moet x.equals(x) true retourneren.

  • Symmetrie: voor elke niet-nul referentiewaarde x en y, moet x.equals(y) true retourneren als en alleen als y.equals(x) true retourneert.

  • Transitiviteit: voor elke drie niet-nul referentiewaarden x, y en z, als x.equals(y) true retourneert en y.equals(z) true retourneert, dan moet x.equals(z) ook true retourneren.

  • Consistentie: voor elke niet-nul referentiewaarde x en y, moeten meerdere aanroepen van x.equals(y) consequent true of false retourneren, op voorwaarde dat geen informatie die in de equals-vergelijkingen van de objecten wordt gebruikt, tussen de aanroepen wordt gewijzigd.

  • Voor elke niet-nul referentiewaarde x, moet x.equals(null) false retourneren.

  • Als twee objecten gelijk zijn volgens de methode equals(Object), dan moet de aanroep van de methode hashCode voor elk van de twee objecten hetzelfde gehele getal opleveren.

  • Het is niet vereist dat, als twee objecten niet gelijk zijn volgens de methode equals(java.lang.Object), de aanroep van de methode hashCode voor elk van de twee objecten verschillende gehele getallen oplevert. Echter, de programmeur moet begrijpen dat het genereren van verschillende hash-codes voor niet-gelijke objecten de prestaties van hash-tabellen kan verbeteren.

Het is belangrijk om beide methoden equals en hashCode te overschrijven als er één wordt overschreven, om het contract te behouden. Het gebruik van equals zonder hashCode overschrijving kan leiden tot incorrect gedrag van hash-gebaseerde collecties (bijvoorbeeld 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; // Reflexiviteit
        if (o == null || getClass() != o.getClass()) return false; // null en type check
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Inhoud vergelijking
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Hash genereren op basis van velden
    }
}