Šta radi metoda equals() u Javi?
sobes.tech АИ
Одговор од АИ
Метод equals() у Јави се користи за поређење два објекта по једнакости. У default-у, у случају објеката који наследју од Object без његовог преоптерећења, он пореди референце на објекте (==), што значи да проверавају да ли променљиве указују на исту локацију у меморији.
Правилно преоптерећење метода equals() је важно за поређење објеката по њиховом садржају, а не по њиховој локацији у меморији.
При преоптерећењу equals(), треба поштовати следећа правила:
- Рефлексивност: за било који ненулски објекат
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)треба да стабилно враћа исти резултат, под условом да информације коришћене за поређење у оба објекта нису мењане између позива. - За било који ненулеви објекат
x,x.equals(null)треба да вратиfalse.
Обично, при преоптерећењу equals(), такође је потребно преоптеретити метод hashCode(), поштујући контракт: ако су два објекта једнака према equals(), њихови хеш-кодови, добијени методом hashCode(), треба да буду исти. Обратна веза није обавезна: ако су хеш-кодови исти, објекти нису нужно једнаки.
Пример преоптерећења:
public class MyObject {
private int value;
private String name;
public MyObject(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public boolean equals(Object o) {
// Само поређење
if (this == o) return true;
// Провера на null и тип објекта
if (o == null || getClass() != o.getClass()) return false;
// Привођење типа и поређење по пољима
MyObject myObject = (MyObject) o;
return value == myObject.value &&
Objects.equals(name, myObject.name);
}
@Override
public int hashCode() {
// Генерисање хеш-кода на основу поља
return Objects.hash(value, name);
}
// геттери, сеттери итд.
}