Sobes.tech
Junior

Какво прави методът equals() в Java?

sobes.tech AI

Отговор от AI

Методът equals() в Java се използва за сравняване на два обекта за равенство. По подразбиране, при обекти, наследяващи от Object без да бъдат преписани, той сравнява референциите към обектите (==), тоест проверява дали променливите сочат към едно и също място в паметта.

Правилното преписване на метода equals() е важно за сравняване на обекти по съдържанието им, а не по местоположението им в паметта.

При преписване на equals() трябва да се спазват следните правила:

  • Рефлексивност: за всеки ненулев обект x, x.equals(x) трябва да връща true.
  • Симетрия: за всякакви ненулеви обекти x и y, ако x.equals(y) връща true, то и y.equals(x) трябва да връща true.
  • Транзитивност: за всякакви ненулеви обекти x, y и z, ако x.equals(y) и 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);
    }

    // гетъри, сетъри и т.н.
}