Sobes.tech
Junior

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

sobes.tech AI

Отговор от AI

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

Въпреки това, повечето класове в Java (например, String, Integer) пренаписват този метод, за да сравняват стойностите, съдържащи се в обектите, а не техните референции.

При пренаписване на equals() е важно да се спазва неговият контракт:

  • Рефлексивност: x.equals(x) трябва да бъде true за всеки ненулев x.
  • Симетрия: x.equals(y) трябва да бъде true ако и само ако y.equals(x) е true, за всички ненулеви x и y.
  • Транзитивност: Ако x.equals(y) и y.equals(z) са true, тогава x.equals(z) също трябва да бъде true за всички ненулеви x, y, z.
  • Консистентност: Многократните извиквания на x.equals(y) трябва да връщат същия резултат, докато обектите не се променят.
  • **За всеки ненулев x, x.equals(null) трябва да бъде false.

Пример за пренаписване на equals():

class MyObject {
    private int value;

    public MyObject(int value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        MyObject myObject = (MyObject) obj;
        return value == myObject.value;
    }
}

Използване на equals():

// Сравнение по референция (по подразбиране в Object)
Object obj1 = new Object();
Object obj2 = new Object();
boolean поРеференция = obj1.equals(obj2); // false

// Сравнение по стойност (след пренаписване на `equals`)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean поСтойност = myObj1.equals(myObj2); // true

Важно е също така да пренапишете метода hashCode(), когато пренаписвате equals(), за да запазите техния контракт и да избегнете проблеми с колекции, базирани на хеширане, като HashMap, HashSet.