Могу ли я сгенерировать hashcode () и equals () только с одним уникальным полем? - PullRequest
1 голос
/ 03 августа 2020

Допустим, у меня есть класс Студент. Каждый объект ученика имеет уникальное поле (int ID) плюс другие общие поля (например, String schoolName et c).

Теперь можно сгенерировать hashcode () и equals (), учитывая ТОЛЬКО идентификатор поля ?

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Да, вы можете абсолютно использовать ID для хэш-кода и его эквивалентов. В зависимости от количества сегментов в HashMap несколько объектов с разными идентификаторами будут совместно использовать один и тот же сегмент, а затем метод equals определит правильный объект. Поскольку вы планируете использовать уникальный идентификатор, метод equals сравнит идентификатор с каждым объектом в ведре -> LinkedList / Tree и определит уникальный объект.

Однако есть загвоздка. Вы можете использовать ID в Hashcode, если ID является своего рода автоматическим приращением, чтобы ваши объекты равномерно распределялись по сегментам. Однако, если ваше поле идентификатора представляет собой какой-то шаблон, например 4, 8, 12, 16 и т. Д. c., Вы в конечном итоге поместите большинство своих объектов в часть ведер. Поэтому в этом случае используйте Hashcode для генерации простого числа, поскольку простые числа являются лучшими кандидатами для равномерного распределения в сегментах.

1 голос
/ 03 августа 2020

Это зависит от намерения вашего объекта и целевой аудитории.

  1. Намерение: Возможен случай, когда студент женится и меняет свою фамилию. Теперь, если ваш код полагается на .equals (), чтобы определить, есть ли изменения для сохранения, тогда изменения не будут приняты для сохранения. То же самое верно и для любого другого поля, которое может измениться в объекте Student.

  2. Аудитория: если вы упаковываете свой объект в библиотеку и передаете его другим. Они могут ожидать, что экземпляр объекта Student равен тогда и только тогда, когда все непереходные поля равны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...