Middle
Kokios yra taisyklės metodams equals ir hashCode?
sobes.tech AI
Atsakymas iš AI
- Jei du objektai yra lygūs pagal metodą
equals(Object), jų hash kodai (grąžinamihashCode()) turi būti vienodi. - Jei du objektai nėra lygūs pagal metodą
equals(Object), jų hash kodai gali būti tiek vienodi, tiek skirtingi. Geros praktikos yra užtikrinti skirtingus hash kodus nesutampantiems objektams, siekiant geresnio kolekcijų, pagrįstų maišos funkcijomis, našumo. hashCode()metodas turi grąžinti tas pačias reikšmes tomis pačiomis sąlygomis, kai jokia informacija, naudojama hash kodo skaičiavimui, nepasikeitė.- Simetrija: bet kokiems
airbobjektams, jeia.equals(b)yratrue, tadab.equals(a)taip pat turi būtitrue. - Reikšmės: bet kokiam nulinio dydžio
aobjektui,a.equals(a)turi būtitrue. - Transityvumas: bet kokiems
a,bircobjektams, jeia.equals(b)yratrueirb.equals(c)yratrue, tadaa.equals(c)taip pat turi būtitrue. - Sutarimas: bet kokiems nulinio dydžio
airbobjektams, keliųa.equals(b)iškvietimų rezultatai turi būti nuosekliaitruearbafalse, jei naudojamaequals(Object)informacija nepasikeitė.
Pavyzdinė įgyvendinimas:
public class MyClass {
private int value;
private String name;
public MyClass(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public boolean equals(Object o) {
// Objektų identiškumo patikrinimas
if (this == o) {
return true;
}
// Objekto tipo patikrinimas
if (o == null || getClass() != o.getClass()) {
return false;
}
// Tipų konvertavimas
MyClass myClass = (MyClass) o;
// Laukų palyginimas
return value == myClass.value &&
Objects.equals(name, myClass.name); // Naudojame Objects.equals null-ams
}
@Override
public int hashCode() {
// Naudojame Objects.hash, kad sugeneruotume hash kodą iš laukų
return Objects.hash(value, name);
}
// Kiti metodai...
}