Показаны сообщения с ярлыком equals. Показать все сообщения
Показаны сообщения с ярлыком equals. Показать все сообщения

четверг, 15 декабря 2011 г.

Переопределение equals и hashCode

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