Sobes.tech
Middle

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); // Генерација хеша на основу поља
    }
}