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.