Papaskink apie equals ir hashCode metodų sutartis Java kalboje.
sobes.tech AI
Atsakymas iš AI
-
Refleksiškumas: bet kokiai nuliui nenuleidžiamai nuorodai
x,x.equals(x)turi grąžintitrue. -
Simetrija: bet kokiai nuliui nenuleidžiamai nuorodai
xiry,x.equals(y)turi grąžintitruejei ir tik jeiy.equals(x)grąžinatrue. -
Transityvumas: bet kokiai nuliui nenuleidžiamai nuorodai
x,yirz, jeix.equals(y)grąžinatrueiry.equals(z)grąžinatrue, tadax.equals(z)turi grąžintitrue. -
Nuoseklumas: bet kokiai nuliui nenuleidžiamai nuorodai
xiry, daugybiniaix.equals(y)iškvietimai turi nuolat grąžintitruearba nuolatfalse, jei nėra keičiamas naudojamosequalspalyginimo informacijos turinys. -
Bet kokiai nuliui nenuleidžiamai nuorodai
x,x.equals(null)turi grąžintifalse. -
Jei du objektai yra lygūs pagal
equals(Object)metodą, tadahashCodemetodo iškvietimas abiem objektams turi duoti tą pačią sveikojo skaičiaus reikšmę. -
Nereikalaujama, kad jei du objektai nėra lygūs pagal
equals(java.lang.Object)metodą,hashCodemetodo iškvietimas abiem objektams duotų skirtingas sveikojo skaičiaus reikšmes. Tačiau programuotojas turi suprasti, kad skirtingų hash kodų generavimas ne lygiesiems objektams gali pagerinti hash lentelių našumą.
Svarbu perrašyti abu metodus equals ir hashCode, jei vienas iš jų perrašomas, kad būtų išlaikytas kontraktas. equals metodo naudojimas be hashCode perrašymo gali sukelti netinkamą kolekcijų, naudojančių hash'inimą, veikimą (pvz., 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; // Refleksiškumas
if (o == null || getClass() != o.getClass()) return false; // Null ir klasės patikra
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Turinys palyginimas
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Hash generavimas pagal laukus
}
}