Sobes.tech
Junior

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