Еще один способ сделать это - создать Object
для обработки вашего ключа, с помощью которого вы можете переопределить equals()
(и hashCode()
) для проверки на входящий ключ, проверяя field1
, field2
и field3
по очереди.
РЕДАКТИРОВАТЬ (в ответ на комментарий):
Поскольку значение, возвращаемое из hashCode()
, используется вашей Картой для помещения ваших ключей в сегменты (из которых затем будет проверяться equals
), теоретически это значение может быть одинаковым для всех ключей. Однако я бы не советовал делать это, поскольку вы бы не воспользовались преимуществами производительности HashMaps. По сути, вы будете перебирать все свои предметы в ведре и тестировать equals()
.
Один из подходов, который вы могли бы использовать, - это делегировать вызов hashCode()
одному из значений в вашем контейнере ключей. Например, вы всегда можете вернуть хэш-код из field3
. В этом случае вы будете распределять свои ключи по потенциально большому количеству сегментов, так как для field3
существуют различные значения. Как только ваш HashMap
найдет корзину, ему все равно придется перебирать элементы в корзине, чтобы проверить результат equals()
, пока не найдет совпадение.
Вы могли бы создать сумму всех значений, возвращаемых hashCode()
во всех ваших полях. Как только что обсуждалось, это значение не обязательно должно быть уникальным. Кроме того, вероятность столкновения, а следовательно, и больших ковшей, намного меньше. Имея это в виду, ваш поиск на HashMap
должен быть быстрее.
РЕДАКТИРОВАТЬ2:
на вопрос о хорошем хэш-коде для этого ключа был дан ответ в отдельном вопросе здесь