Основная идея, стоящая за hashCode
, заключается в том, что объект, который знает, что объект сообщил значение hashCode, отличается от того, что какой-либо другой объект имеет право предполагать, что объекты являются неравными, без необходимости их дальнейшего изучения.Поскольку целые числа поддерживают различные аксиомы, относящиеся к эквивалентности, объект может знать, что два хеш-кода различаются, не сравнивая их напрямую.Например, знание того, что один из них сообщил четное число, а другое нечетное число, было бы достаточно, чтобы показать, что они не могут совпадать.Такие допущения часто позволяют сущностям быстро идентифицировать большие части коллекций, которые не могут содержать искомый объект, и, таким образом, не беспокоить изучение этих областей.
Оба приведенных «требования» относительно hashCode и их равных включают неустановленныепредпосылка: в случаях, когда X.equals(Y)
сообщает об истинности, не нужно, чтобы сущности неправильно предполагали, что это ложно.В целом, для кода очень плохо действовать на основе ложных предположений, поэтому разумно предположить, что не нужно, чтобы объекты делали неверные предположения о равенстве объектов.В Учебном руководстве приводятся ссылки на тот факт, что если два объекта имеют неравные хэш-коды, они будут считаться неравными;для того, чтобы такое предположение соответствовало действительности, требуется, чтобы они были неравными.JavaDoc по существу намекает на тот факт, что если два объекта равны, и один хочет избежать того, чтобы сущности предполагали, что они не будут, и не замечает, что они есть, нужно убедиться, что значение hashCode
, возвращаемое одним, также будетвозвращается другим.