Sobes.tech
Middle

Aké sú pravidlá pre metódy equals a hashCode?

sobes.tech AI

Odpoveď od AI

  1. Ak sú dva objekty rovnaké podľa metódy equals(Object), ich hash kódy (vrátené metódou hashCode()) by mali byť rovnaké.
  2. Ak dva objekty nie sú rovnaké podľa metódy equals(Object), ich hash kódy môžu byť rovnaké alebo odlišné. Dobrou praxou je zabezpečiť odlišné hash kódy pre nerovné objekty pre lepší výkon kolekcií založených na hashovaní.
  3. Metóda hashCode() by mala vracať rovnaké hodnoty pre ten istý objekt pri viacerých volaniach, pokiaľ sa informácie používané na výpočet hash-u nezmenili.
  4. Symetria: pre akékoľvek objekty a a b, ak a.equals(b) je true, potom b.equals(a) tiež musí byť true.
  5. Reflexivita: pre každý nenulový objekt a, a.equals(a) musí byť true.
  6. Transitivita: pre akékoľvek objekty a, b a c, ak a.equals(b) je true a b.equals(c) je true, potom a.equals(c) tiež musí byť true.
  7. Konzistentnosť: pre akékoľvek nenulové objekty a a b, opakované volania a.equals(b) by mali konzistentne vracať true alebo false, pokiaľ sa informácie používané v equals(Object) nezmenili.

Príklad implementácie:

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) {
        // Kontrola identity objektov
        if (this == o) {
            return true;
        }
        // Kontrola typu objektu
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        // Kastovanie
        MyClass myClass = (MyClass) o;
        // Porovnanie podľa polí
        return value == myClass.value &&
               Objects.equals(name, myClass.name); // Použitie Objects.equals pre null
    }

    @Override
    public int hashCode() {
        // Použitie Objects.hash
        return Objects.hash(value, name);
    }

    // Iné metódy...
}