Beszélj a Java-ban az equals és hashCode metódusok szerződéseiről.
sobes.tech MI
Válasz az MI-től
-
Reflexivitás: minden nem null referenciaérték
xeseténx.equals(x)-nektrue-t kell visszaadnia. -
Szimmetria: minden nem null referenciaérték
xésyesetén,x.equals(y)csak akkor legyentrue, hay.equals(x)istrue. -
Transzitivitás: minden nem null referenciaérték
x,yészesetén, hax.equals(y)trueésy.equals(z)true, akkorx.equals(z)istruekell, hogy legyen. -
Konzisztencia: minden nem null referenciaérték
xésyesetén, többszörix.equals(y)hívásnak folyamatosantrue-t vagyfalse-t kell adnia, feltéve, hogy azequalsösszehasonlásokban használt információk nem változnak a hívások között. -
Minden nem null referenciaérték
xeseténx.equals(null)-nakfalse-t kell adnia. -
Ha két objektum az
equals(Object)módszer szerint egyenlő, akkor mindkettőhashCodehívásának ugyanazt az egész szám értéket kell adnia. -
Nem szükséges, hogy ha két objektum nem egyenlő az
equals(java.lang.Object)szerint, akkor ahashCodehívásuk különböző egész számokat adjon. Azonban a programozónak értenie kell, hogy a különböző hash kódok generálása nem egyenlő objektumokra javíthatja a hash táblák teljesítményét.
Fontos, hogy mindkét módszert, az equals-t és a hashCode-t felülírjuk, ha az egyik felülírásra kerül, a szerződés betartása érdekében. Az equals használata anélkül, hogy a hashCode-t felülírnánk, helytelen működéshez vezethet hash-alapú gyűjteményekben (pl. 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; // Reflexivitás
if (o == null || getClass() != o.getClass()) return false; // null és típus ellenőrzése
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Tartalom összehasonlítása
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Hash generálása a mezők alapján
}
}