Отлично объяснил, я еще читал что есть некий контракт, который говорит что если ты переопределяешь метод equals то ты должен также переопределить hashCode ну и равносильно если переопределяешь hashCode
Хорошо рассказал, но почему не упомянул, что по умолчанию для object сравнение идёт по адресам ссылок объектов? поэтому то нам и надо переопределить equals, но ведь иногда надо сравнивать именно адреса. Переопределение hashcode необходимо когда объект будет участвовать в сравнениях где задействована эта функция, например в коллекциях - так более обще. Надо было упомянуть что Set не допускает дублирования, поэтому не добавился одинаковый элемент. Удивлен как много у тебя про Java, причём каждая тема достаточно подробно объснена - с меня подписка. Спасибо за контент.
здравсвуйте. пришел сюда по ссылке... еще зеленый(учусь 3 месяц). не могу понять за счёт чего активизируется метод equals... выходит потому что мы просим вывести количество объектов из arraylist Set и он сразу смотрит автоматически hashcode, а потом уже если нашлись оба одинаковые hashcode активизирует метод equals?
Когда мы добавялем что-то в коллекцию, которая работает через хэш-код, сама коллекция спрашивает у добавляемого обхекта hashCode. Еще раз - мы добавляем в коллекцию методом add, а сама коллекция вызывает методы hashCode и equals у нашего объекта. Удачи :)
@@java8599 в задачке из степика есть в ТЗ вернуть из переопределенного метода хешкод переменную re из вызываемого объекта, Хз как правильно нужно было решать но я вернул return Double.hashCode(re) ; Ещё допишу если есть ошибка
@@emirlanabdullaev8864 Выглядит вполне досттойно. Если тип re Double, то наверно можно re.hashCode(). Если же тип элементаррный double, то вообще хорошо смотрится.
Спасибо! Описанные здесь проблемы с перебором всех объектов коллекции будут очень хорошо проявляться с использованием Hibernate и прочего ORM-подобного при неправильном написании hashCode()
А что если переданный объект не является 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. Спасибо.
Лучшее видео про hashcode! Автору рахмет.
Спасибо,это самое адекватное и понятное объяснение взаимосвязи equals() & hashCode(),которое регулярно спрашивают на собеседовании.Лайк и подписка!
откуда ты знаешь? 10 месяцев назад вы наверное и собеседования-то и ни разу не проходили.
@@preenxus3425 В 2022 спрашивают на джуна
@@preenxus3425 🤡
Очень доходчиво объяснил, спасибо большое)
Самое крутое объяснение, которое я слышала))) Пересматриваю как готовлюсь к собеседованию
Благодарю, отличное видео! Теперь все окончательно устаканилось. Автору респект.
Хорошо объяснили, многие любят мусолить так что понять что то не реально
Спасибо тебе огромное!
Вот теперь у меня появилось полное понимание для чего нужен и как работает hashCode
Лучший!
Без воды. Спасибо!
Частенько возвращаюсь к этому видео по ходу обучения, очень годно, спасибо!
ну наконец-то человек понимающий свое дело
Спасибо за Ваш труд! Коммент в поддержку канала.
Лучшее объяснение ! Для чего они и с чем их готовят! Спасибо!
Отличное объяснение, спасибо за труд!
Пять лет прошло, а ваша лекция полезна.
Она была полезна и 25 лет назад :)
Простое и грамотное объяснение. Большое спасибо за Ваш труд!
Вам подкасты вести нужно с таким голосом) приятно слушать
у тебя талант, продолжай снимать видео , ты изменишь людей которые учат Java
Такой валенок как я даже понял! Спасибо огромное!
Спасибо за структурированное объяснение!
Спасибо за видеоурок!
Прекрасное обьяснение, понятно и доходчиво, без лишней воды!
Спасибо! Действительно, очень полезно
спасибо ! вот теперь стало понятно , зачем вообще это нужно ...
Спасибо, Антон! Очень классное и понятное объяснение! И расставлены все нужные акценты на действительно важной информации.
Самое лучшее объяснение из всех
Очень полезная информация, нужно это пересматривать.
Спасибо за Ваш труд!!!
Огромное спасибо что ТААК разжевали, однозначно лайк и подписка!
Спасибо огромное за объяснение, как отметили в комментариях, у вас талант понятно рассказать тему!
Это лучшее объяснение, спасибо огромное, наконец то понял эту связку
Спасибо за добрые слова. Удачи.
супер. в закладки. спасибо!
Автор, ты просто боженька!
СПАИБО ЗА УРОКИ.
Спасибо, что смотрите.
Я видел много видео про equals и hashcode, но это самое понятное
Отлично объяснил, я еще читал что есть некий контракт, который говорит что если ты переопределяешь метод equals то ты должен также переопределить hashCode ну и равносильно если переопределяешь hashCode
Огромное спасибо, очень полезная информация
С меня лайк и подписка)
Очень качественно,без воды)все просто,понятно,и доходчиво!)
как всегда толково, с расстановкой, по полочкам, спасибо
Спасибо Вам, добрый человек!)
Очень хорошее объяснение, спасибо Вам большое!
Я уже знал об этом. Но Ваше объяснение позволило, что называется, прочувствовать. Спасибо!
Хорошее объяснение, на простом примере
Спасибо. Очень информативно.
Отличное видео 👍
Спасибо, в кой то веки просто и понятно все объяснено
Добавил в закладки, отличное видео. Спасибо!
отличное объяснение, спасибо
Редко пишу комменты, но здесь снимаю шляпу, спасибо!
замечательное видео))
Спасибо огромное, все очень четко и по делу!!!!!
Это самое мое любимое видео на канале)
Прекрасно!!!
Отличное объяснение!
Хорошее объяснение. Спасибо
спасибо! ОГРОМНОЕ.
Класс! Очень хорошо объяснено.
Коротко и по делу!!!
super. 10/10
Так явно эта мысль мне тоже не встречалась в других источниках.
Просто бомба. Спасибо за четкое обьяснение
Отличное объяснение, спасибо!
Лучший!
Хорошо рассказал, но почему не упомянул, что по умолчанию для object сравнение идёт по адресам ссылок объектов? поэтому то нам и надо переопределить equals, но ведь иногда надо сравнивать именно адреса. Переопределение hashcode необходимо когда объект будет участвовать в сравнениях где задействована эта функция, например в коллекциях - так более обще. Надо было упомянуть что Set не допускает дублирования, поэтому не добавился одинаковый элемент. Удивлен как много у тебя про Java, причём каждая тема достаточно подробно объснена - с меня подписка. Спасибо за контент.
здорово объяснил, спасибо
Немного запутано но если подумать ...... лайк!
Красивчик !!!
хороший и понятный урок. спасибо
Супер
здравсвуйте. пришел сюда по ссылке... еще зеленый(учусь 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 👍 да второе
Спасибо!
bomba!
Спасибо! Описанные здесь проблемы с перебором всех объектов коллекции будут очень хорошо проявляться с использованием Hibernate и прочего ORM-подобного при неправильном написании hashCode()
Спасибо
Спасибо большое! только у вас во всем чебурнэте можно найти, уроки по таким не простым темам!
Спасибо, что заглядываете.
спасибо!
А что если переданный объект не является 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. В этом ключ к пониманию этого контракта.
:) переписывал пару раз, что бы было боле наглядно.. чуть сам не запутался.
Вы другими словами сказали то же, что и я. Просто я концентрировался на контракте, как идее - НЕравенство хэшкодов однозначно говорит о том, что объекты НЕ равны. Как это использовать - личное дело каждого.
Лучший!
Спасибо!
Спасибо!!!
Спасибо!