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); // талаалардын негизинде хэш түзүү
}
}