Sobes.tech
Middle

Javaда equals жана hashCode ыкмаларынын келишимдери жөнүндө айтып бер.

sobes.tech AI

AIден жооп

  • Рефлексивдүүлүк: ар бир нөлдөнбөгөн шилтемелүү мааниси үчүн 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(Object) методу боюнча барабар болсо, анда алардын hashCode методу чакырылышы эки объект үчүн бирдей бүтүн сандык маанини бериши керек.

  • Эки объект тең эмес болсо да, алардын hashCode методу чакырылышы ар кандай бүтүн сандык маанилерди бериши талап кылынбайт. Бирок, программалачы, тең эмес объекттер үчүн ар кандай хэш-коддорду жаратуу хэш таблицалардын иштөө ылдамдыгын жакшыртаары түшүнүшү керек.

Эки методду equals жана hashCode кайра аныктоо маанилүү, эгер алардын бири кайра аныкталса, контрактты сактоо үчүн. equals методун hashCode кайра аныктоосуз колдонуу коллекциялардын туура иштебей калуусуна алып келиши мүмкүн (мисалы, HashMap, HashSet).

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // Рефлексивдүүлүк
        if (o == null || getClass() != o.getClass()) return false; // null жана класс текшерүү
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // мазмуну боюнча салыштыруу
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // талаалардын негизинде хэш түзүү
    }
}