Middle
Jakie są zasady dla metod equals i hashCode?
sobes.tech AI
Odpowiedź od AI
- Jeśli dwa obiekty są równe według metody
equals(Object), ich kody hash (zwracane przez metodęhashCode()) powinny być takie same. - Jeśli dwa obiekty nie są równe według metody
equals(Object), ich kody hash mogą być takie same lub różne. Dobrą praktyką jest zapewnienie różnych kodów hash dla nierównych obiektów, aby poprawić wydajność kolekcji opartych na haszowaniu. - Metoda
hashCode()powinna zwracać takie same wartości dla tego samego obiektu podczas wielu wywołań, o ile żadna informacja używana do obliczenia kodu hash nie uległa zmianie. - Symetria: dla dowolnych obiektów
aib, jeślia.equals(b)jesttrue, tob.equals(a)również musi byćtrue. - Refleksyjność: dla każdego nie-nullowego obiektu
a,a.equals(a)musi byćtrue. - Transitywność: dla dowolnych obiektów
a,bic, jeślia.equals(b)jesttrueib.equals(c)jesttrue, toa.equals(c)również musi byćtrue. - Spójność: dla dowolnych nie-nullowych obiektów
aib, wielokrotne wywołaniaa.equals(b)powinny zwracać spójnietruelubfalse, pod warunkiem, że informacje używane w porównaniachequals(Object)nie uległy zmianie.
Przykład implementacji:
public class MyClass {
private int value;
private String name;
public MyClass(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public boolean equals(Object o) {
// Sprawdzenie tożsamości obiektów
if (this == o) {
return true;
}
// Sprawdzenie typu obiektu
if (o == null || getClass() != o.getClass()) {
return false;
}
// Rzutowanie
MyClass myClass = (MyClass) o;
// Porównanie po polach
return value == myClass.value &&
Objects.equals(name, myClass.name); // Użycie Objects.equals do obsługi null
}
@Override
public int hashCode() {
// Użycie Objects.hash do generowania kodu hash
return Objects.hash(value, name);
}
// Inne metody...
}