Ответ
Да, коллизии возможны. Метод hashCode() возвращает 32-битное целое число, а количество возможных объектов в Java значительно больше, поэтому разные объекты могут иметь одинаковый хэш-код.
Пример:
val str1 = "Aa"
val str2 = "BB"
println(str1.hashCode()) // 2112
println(str2.hashCode()) // 2112
Для корректной работы с коллекциями (например, HashMap) важно:
- Переопределять
hashCode()вместе сequals() - Обеспечивать согласованность: если
a.equals(b) == true, тоa.hashCode() == b.hashCode()
Коллизии снижают производительность хэш-коллекций, но не нарушают их работу, так как используется цепочка элементов с одинаковым хэшом.
Ответ 18+ 🔞
Ага, вот это уже интересный разговор. Смотри, тут про хэши речь, про эти вот hashCode(). Ну, в общем, да — коллизии, блядь, возможны, и это не баг, а фича, хоть и пиздопроебибная иногда.
Представь себе: метод hashCode() выплёвывает тебе 32-битное число. Это типа как... ну, ёпта, как попытаться всех жителей Москвы загнать в телефонную книжку на 10 тысяч номеров. Ясно же, что на один номер придётся по пять Ивановых, Петровых и Сидоровых. Вот и тут так же — объектов в Java может быть овердохуища, а уникальных хэшей — всего около 4 миллиардов. Так что разные объекты запросто могут иметь один и тот же хэш-код. Сам от себя охуеешь, когда такое в логах увидишь.
Вот, смотри, классический пример, который всех на собеседованиях ебёт:
val str1 = "Aa"
val str2 = "BB"
println(str1.hashCode()) // 2112
println(str2.hashCode()) // 2112
Вот тебе и хуй с горы! Две разные строки, а хэш один и тот же. Коллизия, ёпта, нарисовалась.
Теперь главное, чтобы ты, чувак, не накосячил, когда со своими коллекциями работаешь. Запомни два железных правила, иначе будет вам хиросима и нигерсраки:
- Переопределяй
hashCode()вместе сequals(). Это как носки — парами ходят. Нельзя один надеть, а второй забыть. Если ты вequals()сказал, что два твоих объекта равны, а хэши у них разные — всё, пиши пропало.HashMapилиHashSetпросто нихуя не поймут и будут искать твой объект не там, где надо. Доверия к такому коду — ебать ноль. - Согласованность, блядь! Если
a.equals(b)вернулtrue, то иa.hashCode()обязан быть равенb.hashCode(). Обратное, кстати, не обязательно — хэши могут совпасть у неравных объектов (это и есть та самая коллизия, с которой мы начали). Но если равные объекты имеют разные хэши — это уже не коллизия, а пиздец и распиздяйство.
Ну и последнее: сами по себе коллизии — это не конец света. Они просто слегка тормозят хэш-коллекции. Внутри HashMap, если два ключа легли в одну корзину (у них одинаковый хэш), они там просто в цепочку связываются (или в дерево, если их много). Коллекция всё равно будет работать корректно, просто поиск в этой конкретной корзине будет чуть дольше. Но если ты специально сконструируешь кучу объектов с одинаковым хэшом — тогда да, твоя HashMap из шустрой структуры превратится в ебанько, которое будет тормозить как черепаха в патруле. Так что не выёбывайся.