Sobes.tech
Junior

Š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);
    }

    // геттери, сеттери итд.
}