Sobes.tech
Junior — Middle

Dlaczego przy dodawaniu identycznych obiektów do HashSet konieczne jest nadpisanie metod hashCode i equals?

sobes.tech AI

Odpowiedź od AI

HashSet w Javie używa tablicy haszującej do przechowywania elementów. Aby poprawnie określić, czy dwa obiekty są takie same i nie dodawać duplikatów, HashSet opiera się na metodach hashCode() i equals().

  • Metoda hashCode() oblicza kod haszujący obiektu, który decyduje, do którego "kosza" (bucket) w tablicy haszującej trafi.
  • Metoda equals() porównuje dwa obiekty pod kątem równości.

Jeśli nie nadpiszesz tych metod w swojej klasie, zostanie użyta implementacja z klasy Object, która porównuje obiekty po referencji (tzn. dwa różne obiekty z tymi samymi danymi będą uważane za różne).

Dlatego, aby HashSet poprawnie rozpoznawał takie same obiekty i nie dopuszczał duplikatów, konieczne jest nadpisanie hashCode() i equals() tak, aby uwzględniały istotne pola obiektu.

Przykład:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    MyClass myClass = (MyClass) o;
    return field1.equals(myClass.field1) && field2.equals(myClass.field2);
}

@Override
public int hashCode() {
    return Objects.hash(field1, field2);
}

Bez tego HashSet może przechowywać kilka obiektów z tymi samymi danymi, co narusza logikę zbioru.