Sobes.tech
Middle

Kokios yra taisyklės metodams equals ir hashCode?

sobes.tech AI

Atsakymas iš AI

  1. Jei du objektai yra lygūs pagal metodą equals(Object), jų hash kodai (grąžinami hashCode()) turi būti vienodi.
  2. Jei du objektai nėra lygūs pagal metodą equals(Object), jų hash kodai gali būti tiek vienodi, tiek skirtingi. Geros praktikos yra užtikrinti skirtingus hash kodus nesutampantiems objektams, siekiant geresnio kolekcijų, pagrįstų maišos funkcijomis, našumo.
  3. hashCode() metodas turi grąžinti tas pačias reikšmes tomis pačiomis sąlygomis, kai jokia informacija, naudojama hash kodo skaičiavimui, nepasikeitė.
  4. Simetrija: bet kokiems a ir b objektams, jei a.equals(b) yra true, tada b.equals(a) taip pat turi būti true.
  5. Reikšmės: bet kokiam nulinio dydžio a objektui, a.equals(a) turi būti true.
  6. Transityvumas: bet kokiems a, b ir c objektams, jei a.equals(b) yra true ir b.equals(c) yra true, tada a.equals(c) taip pat turi būti true.
  7. Sutarimas: bet kokiems nulinio dydžio a ir b objektams, kelių a.equals(b) iškvietimų rezultatai turi būti nuosekliai true arba false, jei naudojama equals(Object) informacija nepasikeitė.

Pavyzdinė įgyvendinimas:

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) {
        // Objektų identiškumo patikrinimas
        if (this == o) {
            return true;
        }
        // Objekto tipo patikrinimas
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        // Tipų konvertavimas
        MyClass myClass = (MyClass) o;
        // Laukų palyginimas
        return value == myClass.value &&
               Objects.equals(name, myClass.name); // Naudojame Objects.equals null-ams
    }

    @Override
    public int hashCode() {
        // Naudojame Objects.hash, kad sugeneruotume hash kodą iš laukų
        return Objects.hash(value, name);
    }

    // Kiti metodai...
}