Sobes.tech
Middle

Porozprávaj o zmluvách metódov equals a hashCode v Jave.

sobes.tech AI

Odpoveď od AI

  • Reflexivita: pre akéhokoľvek nenulovej referenčnej hodnoty x, x.equals(x) by malo vrátiť true.

  • Symetria: pre akékoľvek nenulové referenčné hodnoty x a y, x.equals(y) by malo vrátiť true ak a len ak y.equals(x) vráti true.

  • Transitivita: pre akékoľvek nenulové referenčné hodnoty x, y a z, ak x.equals(y) vráti true a y.equals(z) vráti true, potom x.equals(z) by malo vrátiť true.

  • Konzistentnosť: pre akékoľvek nenulové referenčné hodnoty x a y, opakované volanie x.equals(y) by malo stále vracať true alebo stále false, za predpokladu, že žiadne informácie používané v porovnávaniach equals na objektoch sa medzi volaniami nemenia.

  • Pre akúkoľvek nenulovú referenčnú hodnotu x, x.equals(null) by malo vrátiť false.

  • Ak sú dva objekty rovnaké podľa metódy equals(Object), volanie metódy hashCode pre každý z týchto dvoch objektov by malo dať rovnakú celocíselnú hodnotu.

  • Nie je požadované, aby ak dva objekty nie sú rovnaké podľa metódy equals(java.lang.Object), volanie metódy hashCode pre každý z týchto dvoch objektov dávalo odlišné celocíselné hodnoty. Avšak programátor by mal chápať, že generovanie odlišných hash kódov pre nerovné objekty môže zvýšiť výkon hash tabuliek.

Dôležité je preťažiť obe metódy equals a hashCode, ak sa jedna z nich preťažuje, aby sa zachoval kontrakt. Použitie equals bez preťaženia hashCode môže viesť k nefunkčnosti kolekcií využívajúcich hashovanie (napr. 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; // Reflexivita
        if (o == null || getClass() != o.getClass()) return false; // Kontrola null a typu
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Porovnanie podľa obsahu
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Generovanie hash na základe polí
    }
}