Sobes.tech
Middle

Jakie są zasady dla metod equals i hashCode?

sobes.tech AI

Odpowiedź od AI

  1. Jeśli dwa obiekty są równe według metody equals(Object), ich kody hash (zwracane przez metodę hashCode()) powinny być takie same.
  2. 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.
  3. 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.
  4. Symetria: dla dowolnych obiektów a i b, jeśli a.equals(b) jest true, to b.equals(a) również musi być true.
  5. Refleksyjność: dla każdego nie-nullowego obiektu a, a.equals(a) musi być true.
  6. Transitywność: dla dowolnych obiektów a, b i c, jeśli a.equals(b) jest true i b.equals(c) jest true, to a.equals(c) również musi być true.
  7. Spójność: dla dowolnych nie-nullowych obiektów a i b, wielokrotne wywołania a.equals(b) powinny zwracać spójnie true lub false, pod warunkiem, że informacje używane w porównaniach equals(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...
}