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ćtruedla każdego nie-nullx. - Symetryczność:
x.equals(y)powinno byćtruewtedy i tylko wtedy, gdyy.equals(x)jesttruedla każdego nie-nullxiy. - Przechodniość: Jeśli
x.equals(y)iy.equals(z)sątrue, tox.equals(z)również powinno byćtruedla każdego nie-nullx,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).