Почему необходимо переопределить equals () и hashcode (), используя Set для многозначных ассоциаций? - PullRequest
0 голосов
/ 09 сентября 2018

В руководстве по гибернации сказано, что вам нужно переопределить методы equals () и hashCode (), если вы хотите поместить экземпляры постоянных классов в Set (рекомендуемый способ представления многозначных). ассоциаций).

Итак, появились вопросы:

  • Почему это рекомендуемый способ представления многозначных ассоциаций в наборе? (Почему бы мне не использовать, скажем, ArrayList или LinkedList).

  • Что происходит за сценой, когда я должен переопределять эти методы только при использовании Set?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Почему рекомендуется представлять многозначные ассоциации в установить? (Почему я не должен использовать, скажем, ArrayList или LinkedList) -

Многие отношения всегда уникальны, и нет смысла хранить повторяющиеся значения в коллекции. Как вы знаете, set всегда сохраняет уникальное значение, поэтому рекомендуется использовать Set.

Что происходит за сценой, что я должен переопределить эти методы только когда я использую Set? -

Набор хранит только уникальные элементы. Set использует Hashmap для хранения элемента. Таким образом, идентификация сегмента выполняется с помощью hashCode (), а элементы сравниваются с помощью метода equals ().

0 голосов
/ 09 сентября 2018

Ну, а как иначе HashSet выведет равенство? Это основано на hashCode/equals. Для Set вам понадобятся оба метода, для List используется только equals (например, в методе, например contains), но они определены как оба, так что вы не попадете в странные сюрпризы.

В общем случае хорошо, если вы переопределяете compareTo из Comparable также - это, например, используется внутри для HasMap при обнаружении связи. Вам не нужно, но это хорошая идея, если вы когда-нибудь планируете использовать их в качестве ключей в Map.

То, что, как я сказал, tie используется, когда два хэш-кода равны, а HashMap решает перейти на perfectly balanced tree node, см. здесь или этот ; или даже этот

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