Porozprávaj o zmluvách metódov equals a hashCode v Jave.
sobes.tech AI
Odpoveď od AI
-
Reflexivita: pre akéhokoľvek nenulovej referenčnej hodnoty
x,x.equals(x)by malo vrátiťtrue. -
Symetria: pre akékoľvek nenulové referenčné hodnoty
xay,x.equals(y)by malo vrátiťtrueak a len aky.equals(x)vrátitrue. -
Transitivita: pre akékoľvek nenulové referenčné hodnoty
x,yaz, akx.equals(y)vrátitrueay.equals(z)vrátitrue, potomx.equals(z)by malo vrátiťtrue. -
Konzistentnosť: pre akékoľvek nenulové referenčné hodnoty
xay, opakované volaniex.equals(y)by malo stále vracaťtruealebo stálefalse, za predpokladu, že žiadne informácie používané v porovnávaniachequalsna objektoch sa medzi volaniami nemenia. -
Pre akúkoľvek nenulovú referenčnú hodnotu
x,x.equals(null)by malo vrátiťfalse. -
Ak sú dva objekty rovnaké podľa metódy
equals(Object), volanie metódyhashCodepre každý z týchto dvoch objektov by malo dať rovnakú celocíselnú hodnotu. -
Nie je požadované, aby ak dva objekty nie sú rovnaké podľa metódy
equals(java.lang.Object), volanie metódyhashCodepre každý z týchto dvoch objektov dávalo odlišné celocíselné hodnoty. Avšak programátor by mal chápať, že generovanie odlišných hash kódov pre nerovné objekty môže zvýšiť výkon hash tabuliek.
Dôležité je preťažiť obe metódy equals a hashCode, ak sa jedna z nich preťažuje, aby sa zachoval kontrakt. Použitie equals bez preťaženia hashCode môže viesť k nefunkčnosti kolekcií využívajúcich hashovanie (napr. 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; // Reflexivita
if (o == null || getClass() != o.getClass()) return false; // Kontrola null a typu
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Porovnanie podľa obsahu
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Generovanie hash na základe polí
}
}