Kodėl Java reikalingi metodai equals ir hashCode?
sobes.tech AI
Atsakymas iš AI
„equals“ ir „hashCode“ metodai Java naudojami teisingam objektų palyginimui ir kolekcijų, pagrįstų maišos lentelėmis (pvz., HashMap, HashSet), darbui.
-
equals(Object o): Nustato, ar dabartinis objektas yra lygus kitam objektui. Pagal numatytuosius nustatymus lygina nuorodas į objektus. Perrašomas, kad palygintų objektų vidinę būseną. -
hashCode(): Grąžina sveikąjį reikšmę (maišos kodą) objekto. Naudojamas kolekcijų greitam elementų paieškai. Turi būti suderintas suequals: jei du objektai yra lygūs pagalequals, jų maišos kodai turi būti vienodi. Atvirkštinis teiginys neteisingas.
Netinkamas arba nebuvimas šių metodų perrašymo gali sukelti netinkamą elgesį naudojant objektus kolekcijose, pvz., objekto nebuvimą Set po pridėjimo arba nesugebėjimą rasti objekto HashMap pagal raktą.
Pavyzdys, kaip perrašyti:
public class MyObject {
private int id;
private String name;
public MyObject(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true; // Nuorodų palyginimas
if (o == null || getClass() != o.getClass()) return false; // Tipų ir null patikrinimas
MyObject that = (MyObject) o; // Tipų konvertavimas
if (id != that.id) return false; // Laukų palyginimas
return name != null ? name.equals(that.name) : that.name == null;
}
@Override
public int hashCode() {
int result = id; // Maišos kodo skaičiavimas pagal laukus
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
}