Sobes.tech
Junior — Middle

Защо е необходимо да пренапишем методите hashCode и equals при добавяне на еднакви обекти към HashSet?

sobes.tech AI

Отговор от AI

HashSet в Java използва хеш таблица за съхранение на елементи. За да определи правилно дали два обекта са еднакви и да избегне дублиране, HashSet се базира на методите hashCode() и equals().

  • Методът hashCode() изчислява хеш кода на обекта, който определя в коя "кошница" (bucket) в хеш таблицата ще бъде поставен.
  • Методът equals() сравнява два обекта за равенство.

Ако не препишете тези методи във вашия клас, ще се използва реализацията от класа Object, която сравнява обектите по връзка (т.е. два различни обекта с еднакви данни ще се считат за различни).

Затова, за да разпознава правилно HashSet еднаквите обекти и да не допуска дублиране, е необходимо да препишете hashCode() и equals() така, че да вземат предвид важните полета на обекта.

Пример:

@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);
}

Без това HashSet може да съхранява няколко обекта с еднакви данни, което нарушава логиката на множеството.