Equals and HashCode

  • 24
  • Недоступна
В классе Solution исправить пару методов equals/hashCode в соответствии с правилами реализации этих методов(детали уточни у своего любимого поисковика). Обе строки first и last должны принимать участие в сравнении с помощью метода equals и вычислении hashcode. Метод main не участвует в тестировании.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (154)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Verhun Kyrylo23 уровень
17 сентября, 16:17
Переопределил equals c помощью alt+ins, в хешкоде добавил проверку полей на нул. Все прошло
Lukin Ivan24 уровень, Киев
9 сентября, 13:24
Забавно, уровень сложно, оказался по сложности таким же как и легкие. Только по ощущениям было на оборот. Сперва я решал легкие задачи, прочитав кучу статей, поняв как это работает, после сложная была как легкая. Так что по мне, в этих трех задачах нет разницы какую вы будете решать первой)
Шамиль22 уровень, Кисловодск
24 августа, 14:50
Если входной параметр equals не типа Object то мы не переопределяем equals а просто создаем новый метод который будет работать только в рамках данного класса.Что бы работал с коллекциями, и прочими другими такими как compare, compareTo, ну и много другое то обязательно надо переопределить equals
Baxtiyor25 уровень, Navoi
18 августа, 06:47
Почему всегда число 31 участвует в hashcode() что оно означает? И вообще как реализуется метод не понятно: почему умножается 31 на 1 и плюсуется результат?
Interstellar34 уровень, Воронеж
11 сентября, 09:03
Как правило, используются простые числа (которые не делятся без остатка ни на что кроме 1) при вычислении хэша, чтобы по максимуму избежать коллизий. Это не обязательно 31. Оно должно быть не слишком большое, чтобы уложиться в int, но и не слишком маленькое, чтобы избегать повторяющегося хэша.
niks25 уровень, Москва
30 июля, 13:35
Статью на хабре прочитал, задачу решил, но не пойму одной вещи: мы переопределяем hashCode, но затем в явном виде нигде метод не используем, т.е. сравнение идет по equals. Для чего hashCode переопределяем тут?
Уася31 уровень, Замусральск
2 августа, 10:19
Там, в статье про hasCode & equals написано, что если вы переопределяете один из них, обязательно нужно переопределять и другой. Если вызывается метод equals, перед ним неявно будет вызван hashCode, и если он выдаст false - то до equals дело не дойдёт. Как-то так.
niks25 уровень, Москва
4 августа, 18:43
Спасибо
Шамиль22 уровень, Кисловодск
24 августа, 12:20
Не всегда вызывается hashCode когда вызывается equals! hasCode обязательно нужен переопределять когда используем коллекциями например, HashMap, HashSet и прочих... или когда передаем наш объект другому объекту для сравнения например contains().
Василий Бабин27 уровень, Москва
7 июля, 11:27
Вообщем мучился вчера полдня и сегодня с утра. Первую словил ошибку за то, что проверил класс не через instanceof. Ну, это я быстро исправил. А вот с этим пунктом я долго боролся: Метод equals должен возвращать true в случае, если поля fist и last равны у передаyного объекта и текущего (не забудь что они могут быть null). Как я только не проверял и сколько я if не делал, не проходит и всё пункт валидацию. Перечитал много информации, ну никак не мог пройти. В итоге где-то наткнулся - что null можно проверить через == и не будет выкинуто исключение! В итоге удалил все if на проверку null к чертям. И решил проверить так:
(that.first == first || that.first.equals(first)) && (that.last == last || that.last.equals(last))
И о хвала небесам, валидатоп принял! Спасибо за задачу, пришло много понимания.
D27927 уровень
25 июня, 08:03
Не забывайте проверять null в haskCode() !
Андрей28 уровень, Москва
23 июня, 18:40
Задача помогает разобраться со сравнением, но не без вопросов: 1. Изначально написал такое сравнение String(ов) return first == null ? s.first == null : first.equals(s.first) && last == s.last || last == null ? s.last == null : last.equals(s.last); Не подошло, хотя null сравниваются корректно 2. Поменял на return (first == s.first || first == null ? s.first == null : first.equals(s.first)) && (last == s.last || last == null ? s.last == null : last.equals(s.last)); Опять не подошло 3. Сделал финальный вариант, который даже в IDEA подчеркивается return (first == s.first || (first != null && first.equals(s.first))) && (last == s.last || (last != null && last.equals(s.last))); Вуаля, все прошло. Принципиальных отличий не вижу. З. Ы. ну и была одна ошибка на первой попытке с приоритетом операторов: Было: result = 37 * result + first == null ? 0 : first.hashCode() Надо было: result = 37 * result + (first == null ? 0 : first.hashCode()) Будьте бдительны
Василий Бабин27 уровень, Москва
7 июля, 11:32
У меня без проверки на не null прошло, логика вроде если один null, а другой не null в любом случае вернёт сразу false. А так очень интересно, спасибо! Я правда по другому реализовал hashCode, но тоже прошло.
Evgeny Rakovsky24 уровень, Санкт-Петербург
11 июня, 09:07
C каких пор первая задача идёт hard? А после неё уже easy
java199528 уровень, московская область
24 августа, 08:04
решать можно в любом порядке!
Alexey Tsutsoev33 уровень, Таганрог
6 июня, 17:31
Задача решается за пару секунд через alt+insert
Nims LK27 уровень, Ташкент
1 июля, 16:35
🤙
javaSerdj35 уровень, Санкт-Петербург
30 июля, 17:31
Согласен, и выдает ошибку. getClass()==o.getClass() валю не устраивает. Рука лицо.