Отлично объяснил, я еще читал что есть некий контракт, который говорит что если ты переопределяешь метод equals то ты должен также переопределить hashCode ну и равносильно если переопределяешь hashCode
Хорошо рассказал, но почему не упомянул, что по умолчанию для object сравнение идёт по адресам ссылок объектов? поэтому то нам и надо переопределить equals, но ведь иногда надо сравнивать именно адреса. Переопределение hashcode необходимо когда объект будет участвовать в сравнениях где задействована эта функция, например в коллекциях - так более обще. Надо было упомянуть что Set не допускает дублирования, поэтому не добавился одинаковый элемент. Удивлен как много у тебя про Java, причём каждая тема достаточно подробно объснена - с меня подписка. Спасибо за контент.
Спасибо! Описанные здесь проблемы с перебором всех объектов коллекции будут очень хорошо проявляться с использованием Hibernate и прочего ORM-подобного при неправильном написании hashCode()
здравсвуйте. пришел сюда по ссылке... еще зеленый(учусь 3 месяц). не могу понять за счёт чего активизируется метод equals... выходит потому что мы просим вывести количество объектов из arraylist Set и он сразу смотрит автоматически hashcode, а потом уже если нашлись оба одинаковые hashcode активизирует метод equals?
Когда мы добавялем что-то в коллекцию, которая работает через хэш-код, сама коллекция спрашивает у добавляемого обхекта hashCode. Еще раз - мы добавляем в коллекцию методом add, а сама коллекция вызывает методы hashCode и equals у нашего объекта. Удачи :)
@@java8599 в задачке из степика есть в ТЗ вернуть из переопределенного метода хешкод переменную re из вызываемого объекта, Хз как правильно нужно было решать но я вернул return Double.hashCode(re) ; Ещё допишу если есть ошибка
@@emirlanabdullaev8864 Выглядит вполне досттойно. Если тип re Double, то наверно можно re.hashCode(). Если же тип элементаррный double, то вообще хорошо смотрится.
А что если переданный объект не является MyClass? Сначала нужно проверить на то, что объект является инстанцией нужного класса, а потом проверять на равенство полей. В противном случае, метод может выкидывать ClassCastException, что будет нарушать принцип подстановки Барбары Лисков.
@@java8599 не согласен - все должно быть по правилам, а то кто-то переопределит hashcode и скажет: "Ну, пожалуй и хватит, пора и меру знать". И оставит реализацию equals() без изменений. Нет такого понятия - мера. Если что-то нужно знать и использовать, то это нужно знать и потом использовать, без оглядки на то кому чего будет где видно.
Вот этот ваш лонг в конструкторе как песком по глазам. Зачем принимать лонг, потом преобразовывать его к инту в хэшкоде? Почему не сказано, что это относится к работе коллекций в основе которых лежит хэш таблица? Почему "проверки" не сделаны в тестовых классах, а в мэин навалом? Ну и куча какой то воды, не раскрывающей суть работы хэш таблицы. Не рассказано про бакеты, индексы, коллизии и связанные списки, про лоад фактор. Важность хэшкода проявляется когда понимаешь как работает хэш таблица. А из этого виде как то не очень понятно. 19:55 Хэшкод не сужает ничего. По хэшкоду расчитывается индекс бакета в который попадает обьект, а в нем уже идет поиск по иквелсу если там уже есть обьекты. И эти обьекты там хранятся в виде связанного списка, что в свою очередь затратно для поиска. Вот и все.
Вы рассказываете про реализацию HashMap, но не путайте контракт между equals и hashCode как идею и ее конкретное воплощение в HashMap. Кто Вам сказал, что только HashMap имеет исключительные права на использование этого контракта ?
@@java8599 причем тут HashMap? Это всего лишь одна из реализаций коллекции использующая хэш таблицу. А писал я именно про хэш таблицы. Читайте внимательней что я пишу и не перекручивайте.
@@java8599 по поводу БД. Не мешайте всё в кучу. У вас тут идет разговор про переопределение public int hashCode() для джавовских обджектов. А он возвращает инт как не крути и независимо от того, сколько у вас обьектов в БД и вообще сколько обьектов вы способны нагенерировать. И это напрямую относится к контракту меду хэшкодом и иквелсом. А именно это отднонаправленный контракт. Если a.equals(b)==true, то a.hashCode()==b.hashCode(), но не наоборот. Если a.hashCode()==b.hashCode(), то не обязательно a.equals(b)==true. В этом ключ к пониманию этого контракта. :) переписывал пару раз, что бы было боле наглядно.. чуть сам не запутался.
Вы другими словами сказали то же, что и я. Просто я концентрировался на контракте, как идее - НЕравенство хэшкодов однозначно говорит о том, что объекты НЕ равны. Как это использовать - личное дело каждого.
Вот это уровень! Вот так знания! Спасибо ОГРОМНОЕ за информацию!
Единственный, кто рассказал доступно и самую суть про hashCode. Спасибо.
Спасибо,это самое адекватное и понятное объяснение взаимосвязи equals() & hashCode(),которое регулярно спрашивают на собеседовании.Лайк и подписка!
откуда ты знаешь? 10 месяцев назад вы наверное и собеседования-то и ни разу не проходили.
@@preenxus3425 В 2022 спрашивают на джуна
@@preenxus3425 🤡
Лучшее видео про hashcode! Автору рахмет.
Самое крутое объяснение, которое я слышала))) Пересматриваю как готовлюсь к собеседованию
Очень доходчиво объяснил, спасибо большое)
Благодарю, отличное видео! Теперь все окончательно устаканилось. Автору респект.
Спасибо тебе огромное!
Вот теперь у меня появилось полное понимание для чего нужен и как работает hashCode
Лучший!
Частенько возвращаюсь к этому видео по ходу обучения, очень годно, спасибо!
Хорошо объяснили, многие любят мусолить так что понять что то не реально
Простое и грамотное объяснение. Большое спасибо за Ваш труд!
Без воды. Спасибо!
Спасибо, Антон! Очень классное и понятное объяснение! И расставлены все нужные акценты на действительно важной информации.
у тебя талант, продолжай снимать видео , ты изменишь людей которые учат Java
Пять лет прошло, а ваша лекция полезна.
Она была полезна и 25 лет назад :)
Спасибо за Ваш труд! Коммент в поддержку канала.
Такой валенок как я даже понял! Спасибо огромное!
Лучшее объяснение ! Для чего они и с чем их готовят! Спасибо!
Отличное объяснение, спасибо за труд!
С меня лайк и подписка)
Очень качественно,без воды)все просто,понятно,и доходчиво!)
Это лучшее объяснение, спасибо огромное, наконец то понял эту связку
Спасибо за добрые слова. Удачи.
Прекрасное обьяснение, понятно и доходчиво, без лишней воды!
Спасибо огромное за объяснение, как отметили в комментариях, у вас талант понятно рассказать тему!
ну наконец-то человек понимающий свое дело
Отлично объяснил, я еще читал что есть некий контракт, который говорит что если ты переопределяешь метод equals то ты должен также переопределить hashCode ну и равносильно если переопределяешь hashCode
Очень полезная информация, нужно это пересматривать.
Я уже знал об этом. Но Ваше объяснение позволило, что называется, прочувствовать. Спасибо!
Огромное спасибо что ТААК разжевали, однозначно лайк и подписка!
Спасибо Вам, добрый человек!)
Спасибо за структурированное объяснение!
Спасибо за Ваш труд!!!
Спасибо за видеоурок!
Автор, ты просто боженька!
Спасибо! Действительно, очень полезно
Я видел много видео про equals и hashcode, но это самое понятное
СПАИБО ЗА УРОКИ.
Спасибо, что смотрите.
спасибо ! вот теперь стало понятно , зачем вообще это нужно ...
Огромное спасибо, очень полезная информация
Очень хорошее объяснение, спасибо Вам большое!
Редко пишу комменты, но здесь снимаю шляпу, спасибо!
Самое лучшее объяснение из всех
Вам подкасты вести нужно с таким голосом) приятно слушать
как всегда толково, с расстановкой, по полочкам, спасибо
Добавил в закладки, отличное видео. Спасибо!
супер. в закладки. спасибо!
Спасибо. Очень информативно.
Хорошее объяснение, на простом примере
Спасибо, в кой то веки просто и понятно все объяснено
Хорошо рассказал, но почему не упомянул, что по умолчанию для object сравнение идёт по адресам ссылок объектов? поэтому то нам и надо переопределить equals, но ведь иногда надо сравнивать именно адреса. Переопределение hashcode необходимо когда объект будет участвовать в сравнениях где задействована эта функция, например в коллекциях - так более обще. Надо было упомянуть что Set не допускает дублирования, поэтому не добавился одинаковый элемент. Удивлен как много у тебя про Java, причём каждая тема достаточно подробно объснена - с меня подписка. Спасибо за контент.
Спасибо огромное, все очень четко и по делу!!!!!
Отличное видео 👍
Это самое мое любимое видео на канале)
замечательное видео))
Так явно эта мысль мне тоже не встречалась в других источниках.
Класс! Очень хорошо объяснено.
отличное объяснение, спасибо
Просто бомба. Спасибо за четкое обьяснение
спасибо! ОГРОМНОЕ.
Хорошее объяснение. Спасибо
Отличное объяснение!
Прекрасно!!!
Отличное объяснение, спасибо!
Коротко и по делу!!!
Красивчик !!!
Немного запутано но если подумать ...... лайк!
Супер
Лучший!
super. 10/10
хороший и понятный урок. спасибо
Спасибо! Описанные здесь проблемы с перебором всех объектов коллекции будут очень хорошо проявляться с использованием Hibernate и прочего ORM-подобного при неправильном написании hashCode()
bomba!
здорово объяснил, спасибо
Супер полезно!
здравсвуйте. пришел сюда по ссылке... еще зеленый(учусь 3 месяц). не могу понять за счёт чего активизируется метод equals... выходит потому что мы просим вывести количество объектов из arraylist Set и он сразу смотрит автоматически hashcode, а потом уже если нашлись оба одинаковые hashcode активизирует метод equals?
Когда мы добавялем что-то в коллекцию, которая работает через хэш-код, сама коллекция спрашивает у добавляемого обхекта hashCode.
Еще раз - мы добавляем в коллекцию методом add, а сама коллекция вызывает методы hashCode и equals у нашего объекта.
Удачи :)
@@java8599 спасибо. Понял
Где ? Что за ситуация где "придется" сравнить два объекта ?👀
Посмотрите еще раз. С 12 минуты это проговаривается достаточно подробно. Но может вам нужны другие слова, другое объяснение - люди разные. Удачи.
как вернуть из переопределённого hashCode -> double к примеру 12.005
Никак. Только целое число. И если подумать, то это правильно.
@@java8599 в задачке из степика есть в ТЗ вернуть из переопределенного метода хешкод переменную re из вызываемого объекта,
Хз как правильно нужно было решать но я вернул return Double.hashCode(re) ;
Ещё допишу если есть ошибка
@@emirlanabdullaev8864 Выглядит вполне досттойно. Если тип re Double, то наверно можно re.hashCode(). Если же тип элементаррный double, то вообще хорошо смотрится.
@@java8599 👍 да второе
Спасибо большое! только у вас во всем чебурнэте можно найти, уроки по таким не простым темам!
Спасибо, что заглядываете.
Спасибо!
Спасибо
А что если переданный объект не является MyClass? Сначала нужно проверить на то, что объект является инстанцией нужного класса, а потом проверять на равенство полей. В противном случае, метод может выкидывать ClassCastException, что будет нарушать принцип подстановки Барбары Лисков.
В принципе согласен в Вашими доводами. Просто хотелось сконцентрироваться на главной идее.
@@java8599 Да, но не в ущерб остальным базовым принципам и понятиям, особенно SOLID
@@GusLapchatiy Ну тут каждый решает сам - всегда нужно чуство меры. Иначе из-за леса деревьев не будет видно.
@@java8599 не согласен - все должно быть по правилам, а то кто-то переопределит hashcode и скажет: "Ну, пожалуй и хватит, пора и меру знать". И оставит реализацию equals() без изменений. Нет такого понятия - мера. Если что-то нужно знать и использовать, то это нужно знать и потом использовать, без оглядки на то кому чего будет где видно.
@@GusLapchatiy Ну это Ваша точка зрения. У меня другая. И что ?
спасибо!
oigitelino!
Хорошо что не Нурлан)
Mujik !!!
Вот этот ваш лонг в конструкторе как песком по глазам. Зачем принимать лонг, потом преобразовывать его к инту в хэшкоде? Почему не сказано, что это относится к работе коллекций в основе которых лежит хэш таблица? Почему "проверки" не сделаны в тестовых классах, а в мэин навалом? Ну и куча какой то воды, не раскрывающей суть работы хэш таблицы. Не рассказано про бакеты, индексы, коллизии и связанные списки, про лоад фактор. Важность хэшкода проявляется когда понимаешь как работает хэш таблица. А из этого виде как то не очень понятно. 19:55 Хэшкод не сужает ничего. По хэшкоду расчитывается индекс бакета в который попадает обьект, а в нем уже идет поиск по иквелсу если там уже есть обьекты. И эти обьекты там хранятся в виде связанного списка, что в свою очередь затратно для поиска. Вот и все.
Вы рассказываете про реализацию HashMap, но не путайте контракт между equals и hashCode как идею и ее конкретное воплощение в HashMap. Кто Вам сказал, что только HashMap имеет исключительные права на использование этого контракта ?
А по поводу Long в конструкторе - в базе данных у Вас так мало записей, что Вы можете себе позволить делать идентификатор в виде Integer ?
@@java8599 причем тут HashMap? Это всего лишь одна из реализаций коллекции использующая хэш таблицу. А писал я именно про хэш таблицы. Читайте внимательней что я пишу и не перекручивайте.
@@java8599 по поводу БД. Не мешайте всё в кучу. У вас тут идет разговор про переопределение public int hashCode() для джавовских обджектов. А он возвращает инт как не крути и независимо от того, сколько у вас обьектов в БД и вообще сколько обьектов вы способны нагенерировать. И это напрямую относится к контракту меду хэшкодом и иквелсом. А именно это отднонаправленный контракт. Если a.equals(b)==true, то a.hashCode()==b.hashCode(), но не наоборот. Если a.hashCode()==b.hashCode(), то не обязательно a.equals(b)==true. В этом ключ к пониманию этого контракта.
:) переписывал пару раз, что бы было боле наглядно.. чуть сам не запутался.
Вы другими словами сказали то же, что и я. Просто я концентрировался на контракте, как идее - НЕравенство хэшкодов однозначно говорит о том, что объекты НЕ равны. Как это использовать - личное дело каждого.
Лучший!
Спасибо!
Спасибо!!!
Спасибо!