Sobes.tech
Junior

Co robi metoda equals() w Java?

sobes.tech AI

Odpowiedź od AI

Metoda equals() w Javie służy do porównywania zawartości dwóch obiektów. Domyślnie, w klasie Object, porównuje ona odwołania do obiektów, czyli sprawdza, czy dwie zmienne wskazują na ten sam obiekt w pamięci.

Jednak większość klas w Javie (np. String, Integer) nadpisuje tę metodę, aby porównywać wartości zawarte w obiektach, a nie ich odwołania.

Przy nadpisywaniu equals() ważne jest, aby przestrzegać jego kontraktu:

  • Refleksyjność: x.equals(x) powinno być true dla każdego nie-null x.
  • Symetryczność: x.equals(y) powinno być true wtedy i tylko wtedy, gdy y.equals(x) jest true dla każdego nie-null x i y.
  • Przechodniość: Jeśli x.equals(y) i y.equals(z)true, to x.equals(z) również powinno być true dla każdego nie-null x, y, z.
  • Spójność: Wielokrotne wywołania x.equals(y) powinny zwracać ten sam wynik, pod warunkiem, że obiekty nie uległy zmianie.
  • **Dla każdego nie-null x, x.equals(null) powinno być false.

Przykład nadpisania equals():

class MyObject {
    private int value;

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        MyObject myObject = (MyObject) obj;
        return value == myObject.value;
    }
}

Użycie equals():

// Porównanie po referencji (domyślnie w Object)
Object obj1 = new Object();
Object obj2 = new Object();
boolean poReferencji = obj1.equals(obj2); // false

// Porównanie po wartości (po nadpisaniu `equals`)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean poWartosci = myObj1.equals(myObj2); // true

Ważne jest również nadpisanie metody hashCode() przy nadpisywaniu equals(), aby zachować ich kontrakt i uniknąć problemów z kolekcjami korzystającymi z haszowania (np. HashMap, HashSet).