Räägi Java meetodite equals ja hashCode lepingutest.
sobes.tech AI
Vastus AI-lt
-
Refleksiviteet: igaüle mitte-null viidete
xpuhul peabx.equals(x)tagastamatrue. -
Sümbiootilisus: igaüle mitte-null viidete
xjaypuhul peabx.equals(y)tagastamatrueainult siis, kuiy.equals(x)tagastabtrue. -
Transitiivsus: igaüle mitte-null viidete
x,yjazpuhul, kuix.equals(y)jay.equals(z)mõlemad tagastavadtrue, siis peabx.equals(z)samuti tagastamatrue. -
Konsistentsus: igaüle mitte-null viidete
xjaypuhul, korduvadx.equals(y)kutsed peavad alati tagastama sama väärtuse, kastruevõifalse, tingimusel etequalsvõrdluses kasutatud teave ei muutu vahepeal. -
Igaüle mitte-null viidete
xpuhul peabx.equals(null)tagastamafalse. -
Kui kaks objekti on võrdsed vastavalt
equals(Object)meetodile, siishashCodemeetodi väljakutse nendele objektidele peab andma sama täisarvulise väärtuse. -
Ei ole nõutav, et kui kaks objekti ei ole võrdsed
equals(java.lang.Object)meetodi järgi, siishashCodemeetodi väljakutse nendele objektidele annaks erinevad täisarvulised väärtused. Kuid programmeerija peaks mõistma, et erinevate hash-koodide genereerimine mitte-võrdsete objektide jaoks võib parandada hash-tabelite jõudlust.
Oluline on üle kirjutada mõlemad meetodid equals ja hashCode, kui üks neist üle kirjutatakse, et säilitada leping. equals meetodi kasutamine ilma hashCode üle kirjutamiseta võib põhjustada kolektsioonide, mis kasutavad hashimise, ebaõiget tööd (näiteks 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; // Refleksivsus
if (o == null || getClass() != o.getClass()) return false; // Null ja klassi kontroll
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Sisu võrdlus
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Hashi genereerimine väljade põhjal
}
}