Java-да equals() әдісі не істейді?
sobes.tech AI
AI-дан жауап
Java-да equals() әдісі екі объектіні теңестіруге салыстырады.
Әдепкі бойынша, негізгі класс Object-те, equals() жүзеге асыруы == операторына ұқсас, яғни ол екі айнымалының бірдей объектке сілтеме жасайтынын тексереді.
Алайда, көптеген пайдаланушы анықтаған кластар үшін, мысалы, жолдар (String) немесе жинақтар (Collection), бұл әдіс қайта анықталады, объектілерді олардың мазмұны бойынша салыстыру үшін (логикалық теңдік), сілтемелер бойынша емес.
equals()-ты қайта анықтағанда, келесі сипаттамалар сақталуы керек:
- Рефлексивтілік: Кез келген нөлдік емес сілтеме мәні үшін
x,x.equals(x)trueқайтаруы керек. - Симметрия: Кез келген нөлдік емес
xжәнеyүшін,x.equals(y)trueболса, ондаy.equals(x)теtrueболуы керек. - Транзитивтілік: Кез келген
x,y, жәнеzүшін, егерx.equals(y)жәнеy.equals(z)trueболса, ондаx.equals(z)теtrueболуы керек. - Тұрақтылық: Кез келген
xжәнеyүшін, бірнеше шақыруларx.equals(y)тұрақты түрдеtrueнемесеfalseқайтаруы керек, егер салыстыруда қолданылатын ақпарат өзгермесе. - Кез келген нөлдік емес
xүшін,x.equals(null)falseқайтаруы керек.
Сонымен қатар, equals()-ты қайта анықтағанда, hashCode() әдісін де қайта анықтау маңызды, себебі олар тығыз байланысты. Егер екі объект equals() бойынша тең деп есептелсе, олардың hashCode() қайтарған хэш-кодтары бірдей болуы керек.
Қарапайым кластың equals()-ты қайта анықтау мысалы:
public class MyClass {
private int id;
private String name;
public MyClass(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyClass myClass = (MyClass) o;
return id == myClass.id &&
Objects.equals(name, myClass.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}