Java Что следует учитывать при переопределении equals и hashCode?

Что следует учитывать при переопределении equals и hashCode? С какими "подводными камнями" можно столкнутся при их переопределении?

Я конечно не особо сильно разбирался с java, но переопределение методов Equals и GetHashCode в C# должно быть аналогично переопределению equals и hashCode в Java. Из этого могу сказать следующее: при переопределении хотя бы одного метода (неважно будь-то Equals или GetHashCode) нужно переопределять оба! Поскольку они оба могут быть использованы для проверки являются ли объекты одинаковыми и нехорошо получиться, если Equals будет говорить, что объекты одинаковые, но при этом значение их хеш-кодов будет разными (что говорит об обратном). Из этого также следует, что при переопределении данных методах в них (при определении равности объектов) нужно использовать одну и туже группу полей как в переопределённом методе Equals и GetHashCode.

1 Симпатия