Sobes.tech
Junior

Ko dara metode equals() Java?

sobes.tech AI

Atbilde no AI

Java equals() metode tiek izmantots divu objektu vienādības salīdzināšanai. Noklusējuma gadījumā, gadījumā, ja objekti manto no Object bez tā pārrakstīšanas, tas salīdzina atsauces uz objektu (==), tas ir, pārbauda, vai mainīgie norāda uz to pašu atmiņas vietu.

Pareiza equals() metodes pārrakstīšana ir svarīga, lai salīdzinātu objektus pēc to satura, nevis pēc to atrašanās vietas atmiņā.

Pārrakstot equals(), jāievēro šādi noteikumi:

  • Refleksivitāte: jebkuram nullei līdzīgam x objektam, x.equals(x) jāatgriež true.
  • Simetrija: jebkuriem x un y objektiem, ja x.equals(y) atgriež true, tad arī y.equals(x) jāatgriež true.
  • Transitivitāte: jebkuriem x, y un z objektiem, ja x.equals(y) un y.equals(z) abi ir true, tad arī x.equals(z) jābūt true.
  • Konsistence: jebkuriem x un y objektiem, atkārtoti izsaucot x.equals(y), jāatgriež tas pats rezultāts, ja informācija, kas tiek izmantota salīdzinājumam, nav mainījusies starp izsaukumiem.
  • Nulla: jebkuram x objektam, x.equals(null) jāatgriež false.

Parasti, pārrakstot equals(), ir nepieciešams arī pārrakstīt hashCode() metodi, ievērojot kontraktu: ja divi objekti ir vienādi pēc equals(), tad to hashCode() vērtības ir jābūt vienādām. Atgriezeniskā saite nav obligāta: ja hashCode() ir vienādi, objekti var nebūt vienādi.

Piemērs pārrakstīšanai:

public class MyObject {
    private int value;
    private String name;

    public MyObject(int value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        // Pārbaude
        if (this == o) return true;
        // Pārbaude null un tipa
        if (o == null || getClass() != o.getClass()) return false;
        // Tipa konvertēšana un salīdzināšana pēc laukiem
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // Hash koda ģenerēšana pēc laukiem
        return Objects.hash(value, name);
    }

    // geteri, seteri un t.t.
}