Есть у класса Object такой метод, как equals, который используется для сравнения двух объектов. По умолчанию он выглядит так:
public boolean equals(Object obj){
return (this == obj);
}
Т.е. просто сравниваются две ссылки(прямо как оператор "=="). Понятно, что обычно, это не то, что нам надо. Обычно два объекта равны, если основные данные их равны. Чтобы это понимали не только мы, но и компилятор, нам и нужно переопределять метод equals. Существует несколько свойств, которым должен удовлетворять наш переопределенный метод, а именно:
- Симметричность. Т.е. если для каких-либо объектов x и y x.equals(y) возвращает true, то и y.equals(x) должен возвращать true.
- Рефлексивность. Для любого объекта x x.equals(x) должен возвращать true.
- Постоянство. Для любых объектов x и y x.equals(y) возвращает одно и тоже, если информация, используемая в сравнениях, не меняется.
- Транзитивность. Для любых объектов x, y и z, если x.equals(y) вернет true и y.equals(z) вернет true, то и x.equals(z) должен вернуть true.
В этих свойствах подразумевается, что объекты не null. А для null всё просто
- Для любого не null объекта x x.equals(null) должен возвращать false.
Итак, предположим у нас есть такой вот класс: