Чаро дар илова кардани объектҳои якхела ба HashSet зарур аст, ки методҳои hashCode ва equals-ро такрор нависем?
sobes.tech AI
Ҷавоб аз AI
Javaда HashSet элементларни сақлаш учун хеш-жадвалдан фойдаланади. Икки объектнинг бир хил ёки йўқлигини тўғри аниқлаш ва дубльларни олдини олиш учун 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 бир хил маълумотларга эга бўлган бир нечта объектни сақлай олади, бу эса тўпламнинг мантиғини бузади.