Ответ
Да, должен. Консистентность (постоянство) — одно из обязательных свойств контракта метода equals().
Согласно контракту Object.equals():
- Рефлексивность:
x.equals(x)всегдаtrue. - Симметричность: если
x.equals(y) == true, тоy.equals(x) == true. - Транзитивность: если
x.equals(y)иy.equals(z), тоx.equals(z). - Консистентность: повторные вызовы
x.equals(y)должны возвращать одно и то же значение, пока объекты не будут изменены. - Сравнение с null:
x.equals(null)всегдаfalse.
Пример корректного поведения:
String a = "Hello";
String b = "Hello";
String c = "World";
System.out.println(a.equals(b)); // true (первый вызов)
System.out.println(a.equals(b)); // true (второй вызов - результат тот же)
System.out.println(a.equals(c)); // false
Почему это важно? Нарушение консистентности делает поведение коллекций (HashSet, HashMap) непредсказуемым. Объект может «потеряться» в HashSet, если при добавлении equals вернул один результат, а при поиске — другой.
Правильная реализация equals() должна сравнивать только «стабильные» поля, значения которых не меняются случайным образом между вызовами.