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
xiy, jeślix.equals(y)zwracatrue, toy.equals(x)również powinno zwracaćtrue. - Przechodniość: dla dowolnych nie-nullowych obiektów
x,yiz, jeślix.equals(y)iy.equals(z)zwracajątrue, tox.equals(z)również powinno zwracaćtrue. - Spójność: dla dowolnych nie-nullowych obiektów
xiy, wielokrotne wywołaniax.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.
}