Junior — Middle
86
HashMap-қа тең деп есептелетін, бірақ hashCode мәндері әртүрлі екі объектіні енгізуге тырыссаңыз, не болады?
Сұралған компаниялар
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) болуы керек.