Sobes.tech
Junior — Middle
86

HashMap-қа тең деп есептелетін, бірақ hashCode мәндері әртүрлі екі объектіні енгізуге тырыссаңыз, не болады?

Сұралған компаниялар
OZONOZON

AI-дан жауап

sobes.tech AI

Егер екі объект equals() әдісі бойынша тең деп есептелсе, бірақ олардың hashCode() мәндері әртүрлі болса, онда HashMap-ке енгізу кезінде дұрыс жұмыс істемеуі мүмкін.

Неге?

  • HashMap алдымен объектіні орналастыру үшін hashCode() қолданады.
  • Содан кейін ішіндегі корзинада объектілерді equals() арқылы салыстырады.

Егер тең объектілердің hashCode() мәндері әртүрлі болса, олар әртүрлі корзиналарға түседі, және HashMap кілттің бар-жоғын анықтай алмайды.

Нәтижесінде:

  • HashMap-те кілттердің қайталануы пайда болуы мүмкін, бұл коллекцияның келісімін бұзады.
  • Кілт бойынша іздеу кезінде объект табылмауы мүмкін, себебі hashCode() сәйкес келмейді.

Мысал:

class Key {
    private int id;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Key)) return false;
        Key key = (Key) o;
        return id == key.id;
    }

    @Override
    public int hashCode() {
        return id + 1; // Қате: тең объектілер үшін бірдей `hashCode()` болуы керек
    }
}

Егер equals екі объектіні тең деп есептесе (мысалы, id=1), бірақ hashCode әртүрлі мәндер қайтарса, HashMap дұрыс жұмыс істемейді.

Сондықтан келісімшартты сақтау маңызды: егер equals(a, b) == true, онда hashCode(a) == hashCode(b) болуы керек.