Какво прави методът 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);
}
// гетъри, сетъри и т.н.
}