Ispričaj o ugovorima metoda equals i hashCode u Javi.
sobes.tech АИ
Одговор од АИ
-
Рефлексивност: за било које непразно референцијално вредност
x,x.equals(x)треба да вратиtrue. -
Симетричност: за било које непразне референцијалне вредности
xиy,x.equals(y)треба да вратиtrueако и само акоy.equals(x)враћаtrue. -
Транзитивност: за било које непразне референцијалне вредности
x,yиz, акоx.equals(y)враћаtrueиy.equals(z)враћаtrue, ондаx.equals(z)треба да вратиtrue. -
Сагласност: за било које непразне референцијалне вредности
xиy, многократни позивx.equals(y)треба да стално враћаtrueили стално враћаfalse, под условом да се никакве информације коришћене у поређењимаequalsна објектима не мењају између позива. -
За било које непразно референцијално вредност
x,x.equals(null)треба да вратиfalse. -
Ако су два објекта једнака у складу са методом
equals(Object), онда позив методаhashCodeза сваки од та два објекта треба да даје исту целобројну вредност. -
Не захтева се да ако два објекта нису једнаки у складу са методом
equals(java.lang.Object), позив методаhashCodeза сваки од та два објекта даје различите целобројне вредности. Међутим, програмер треба да разуме да генерисање различитих хеш-кодова за неједнаке објекте може побољшати перформансе хеш табела.
Важно је преоптерећивати оба метода equals и hashCode, ако се један од њих преоптерећује, како би се одржао контракт. Коришћење equals без преоптерећења hashCode може довести до неисправног рада колекција које користе хеширање (нпр. 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; // Рефлексивност
if (o == null || getClass() != o.getClass()) return false; // Проверка null и типа
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Сравњење по садржају
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Генерација хеша на основу поља
}
}