Обычно я не реализую вещи заранее, если они мне не нужны.
Если в моем классе содержатся члены с данными, и я планирую где-то их хранить, я обычно использую equals, hashCode и сопоставимые.
Однако я обнаружил, что большинство моих классов не имеют этой проблемы, поэтому нет смысла это делать. Например, если ваш класс вращается вокруг функциональности других объектов, а не данных, зачем беспокоиться? Если у вас есть один экземпляр или он организован иерархически (например, графический виджет или окно), зачем беспокоиться?
Не реализуйте вещи, которые вам не нужны, но всегда проверяйте, нужны ли они или нет, потому что Java обычно не предупредит вас.
Кроме того, обязательно используйте вашу IDE или что-то вроде Apache Commons для генерации этих функций. Редко возникает необходимость кодировать их вручную.
Что касается toString, я редко реализую его, пока не обнаружу, что отлаживаю и нуждаюсь в лучшей презентации в отладчике Eclipse (например, вместо ID объекта). Я боюсь неявных преобразований и никогда не использую toString при генерации вывода.