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 dwóch obiektów pod kątem równości. Domyślnie, w przypadku obiektów dziedziczących po Object bez nadpisania, porównuje ona odwołania do obiektów (==), czyli sprawdza, czy zmienne wskazują na ten sam obszar pamięci.

Poprawne nadpisanie metody equals() jest ważne, aby porównywać obiekty na podstawie ich zawartości, a nie lokalizacji w pamięci.

Przy nadpisywaniu equals() należy przestrzegać następujących zasad:

  • Refleksyjność: dla każdego nie-nullowego obiektu x, x.equals(x) powinno zwracać true.
  • Symetria: dla dowolnych nie-nullowych obiektów x i y, jeśli x.equals(y) zwraca true, to y.equals(x) również powinno zwracać true.
  • Przechodniość: dla dowolnych nie-nullowych obiektów x, y i z, jeśli x.equals(y) i y.equals(z) zwracają true, to x.equals(z) również powinno zwracać true.
  • Spójność: dla dowolnych nie-nullowych obiektów x i y, wielokrotne wywołania x.equals(y) powinny zwracać ten sam wynik, o ile informacje użyte do porównania się nie zmieniły.
  • Dla każdego nie-nullowego obiektu x, x.equals(null) powinno zwracać false.

Zazwyczaj, przy nadpisywaniu equals(), należy również nadpisać metodę hashCode(), zachowując kontrakt: jeśli dwa obiekty są równe według equals(), to ich kody hash, zwrócone przez hashCode(), muszą być takie same. Odwrotność nie jest obowiązkowa: jeśli kody hash są takie same, obiekty nie muszą być równe.

Przykład nadpisania:

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) {
        // Samo porównanie
        if (this == o) return true;
        // Sprawdzenie na null i typ obiektu
        if (o == null || getClass() != o.getClass()) return false;
        // Rzutowanie i porównanie po polach
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // Generowanie kodu hash na podstawie pól
        return Objects.hash(value, name);
    }

    // gettery, settery itd.
}