Sobes.tech
Middle

Kādi ir noteikumi metodiem equals un hashCode?

sobes.tech AI

Atbilde no AI

  1. Ja divi objekti ir vienādi pēc equals(Object) metodes, tad to hash kodi (kas tiek atgriezts ar hashCode()) ir jābūt vienādiem.
  2. Ja divi objekti nav vienādi pēc equals(Object) metodes, to hash kodi var būt gan vienādi, gan atšķirīgi. Labā prakse ir nodrošināt atšķirīgus hash kodus nesaskaņotiem objektiem, lai uzlabotu kolekciju, kas balstītas uz hash funkcijām, veiktspēju.
  3. hashCode() metodei jāatgriež vienādi vērtības tajās pašās apstākļos, ja nekāda informācija, kas tiek izmantota hash koda aprēķinā, nav mainījusies.
  4. Simetrija: jebkuriem a un b objektiem, ja a.equals(b) ir true, tad b.equals(a) arī ir jābūt true.
  5. Reflēksivitāte: jebkuram a nullei līdzīgam objektam, a.equals(a) ir jābūt true.
  6. Transitivitāte: jebkuriem a, b un c objektiem, ja a.equals(b) ir true un b.equals(c) ir true, tad a.equals(c) arī ir jābūt true.
  7. Saskaņotība: jebkuriem nullei līdzīgiem a un b objektiem, vairāki a.equals(b) izsaukumi ir jāatgriež konsekventi true vai false, ja equals(Object) izmantotā informācija nav mainījusies.

Piemēra realizācija:

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) {
        // Objektu identitātes pārbaude
        if (this == o) {
            return true;
        }
        // Objekta tipa pārbaude
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        // Tipa pārveidošana
        MyClass myClass = (MyClass) o;
        // Lauku salīdzināšana
        return value == myClass.value &&
               Objects.equals(name, myClass.name); // Izmantojam Objects.equals null-iem
    }

    @Override
    public int hashCode() {
        // Izmantojam Objects.hash, lai ģenerētu hash kodu no laukiem
        return Objects.hash(value, name);
    }

    // Citas metodes...
}