@@arhitutorials подскажите пожалуйста , как IDEA автоматически переопределяет методы как у Вас. У меня при переопределении выходит все по стандарту. @Override public String toString() { return super.toString()} @Override public int hashCode() { return super.hashCode() } Понимаю может вопрос тупой , поэтому заранее извиняюсь... А так в целом все последовательно и понятно , спасибо.
Благодарю за грамотную подачу материала, пояснение ньюансов и доступность исходников☺ ☺ ☺ Очень помагает наличие теоретической составляющей, а не просто кода!
Всем доброго дня! Обращаюсь к автору: я пересмотрел множество различных видео уроков, Ваши как минимум одни из лучших!!! Если у Вас будет время и желание, сделайте уроки по Java для начинающих. Уверен, что многие оценят!!!
Только начал учить Java и сразу влюбился в этот язык за его строгость и предсказумость, а тут это!!)))) НУ ЗАЧЕМ?)) Есть все таки что-то от сатаны в этих языках с приставкой Java ))
У меня IDEA совсем в другом виде переопределила equals и hashCode. В методе hashCode вообще нет реализации, как на этом видео, только 'return Objects.hash(a, b)'.
Спасибо! Стараюсь) Конечно возможно. Только отвечаю иногда долго, потому что работа. Так же, если будет интересен Android, могу помочь с обучением: ответы на вопросы, задачи, code review, и все в таком духе.
Sergey Arkhipov Спасибо большое! Android планирую немного попозже. Сейчас конкретно практикую Java Core. Так как цель устроиться на Junior. Возможно по Java делать code review?)
Здравствуйте, спасибо за контент, все доступно объясняете! Только у меня вопрос обязательно ли что б equals и hashcode использовали одинаковые поля? т.е. можно ли высчитывать хэшкод по одному полю а сравнивать в equals по трем полям?
Все можно, только надо отдавать себе отчет, зачем это делать. А то так можно дойти до ситуации, когда объекты, равные по equals, будут иметь разный хеш-код. Тогда уже нельзя будет рассчитывать на то, что если хэш-код объектов разный то и объекты тоже разные. А значит equals() и hashcode() больше не согласованы и совместно не работают.
Здравствуйте. получается что hashCode and equals вы переопределили сразу в видео на 4:13 минуте? и как на 11:05 вы выделили все слова и заменили их все одновременно?
@@arhitutorials О-О-о, интересно бы было. Я с JavRush иду по курсу, сюда пришел когда искал поиск второго минимального элемента в массиве. Сделал задачу перевода из двоичного в шестнадцатеричного через десятичное, вывод результата как надо, но некоторые пункты не проходили. Подписан, так что увижу если что.
Сергей, у меня такой вопрос, а почему в качестве кода hashCode не использовать например UUID? разве это не поможет избежать коллизий? или тут вопрос скорее в том на основе чего генерируется хэш?
Два объекта с одинаковыми данными должны иметь одинаковые хэши. Это одно из свойств хэш функции. По этому просто так раздать всем UUID нельзя, надо генерировать на основе данных объекта.
Здравствуйте. Можете поподробнее объяснить на 4:27 " Contact contact = (Contact ) o " ! Вы об этом ничего не сказали. Так как от этой строки (которую я недопонял) идёт дальше построение кода на сравнение итд
В сигнатуре метода equals параметр имеет тип Object, что даёт возможность сравнивать на equals объекты разных типов. В подавляющем большинстве случаев это не нужно, по этому в методе сразу проверяется, что аргумент имеет тот же тип. Если да, то аргумент приводится к соответствующему типу, contact = (Contact) o; И дальше уже идёт логика сравнения полей объектов.
Привет, можно. На главной странице есть ссылка на фейсбук, можно туда писать. Я вообще думаю, не создать ли нам сообщество или канал в телеграмме, чтоб было удобнее обсуждать вопросы, делиться новостями и т.д. Как вам идея?)
@@Duskmage1991 Создал группу в Telegram: t.me/ArhiTutorials Добавил ссылку в шапку канала. Теперь будет у нас место для неформального общения, вопросов, взаимопомощи, новостей и прочего. Буду продвигать группу по мере возможности.
Это приведение типа переменной o к типу Contact. Функция equals имеет следующую сигнатуру: public boolean equals(Object o); - то есть, может принимать в качестве параметра объект любого типа. По этому внутри нужна проверка и приведение: if (!(o instanceof Contact)) return false; Contact contact = (Contact) o; А дальше, если нам передали объект типа Contact, тогда уже проверяем отдельные поля.
Спасибо. Позволю себе небольшой совет для шлифовки - можно чуть улучшить читабельность если поменять имена. Например вместо: *contacts.contains(contact2)* сделать: *phones.contains(Ivan)*
@@Das.Kleine.Krokodil это да, только читабельность кода и читабельность текста это не одно и то же. Ваш пример это каша. Сущность contact содержит набор данных: имя, телефон, адрес и т.д. соответственно contacts это коллекция сущностей contact, поэтому contacts.contains(contact) читается понятно и логично. А phones.contacts(Ivan) читается как телефоны содержат Ивана, какая связь вообще непонятно
Я вот только одного понять не могу, какого хрена в Set нет метода get()?!?! Ну положил я в Set данные, и что мне дальше с ним делать? Любоваться? Как вообще можно было так ступить и не дать возможности забирать элементы из коллекции. А нововведенный Record? Молодцы, сделали Immuteble класс, но кто вас просил закрывать его от рефлексии? Что мешало добавить final и только тогда делать Record immuteble? А вот без неё - это простой POJO класс. И вместо повсеместного использования - их удел DTO, а народ продолжает использовать Lombok. А как бы шикарно record`ы смотрелись бы... да везде. Просирать полимеры это прям талант.
я один абсолютно не розумію логіки 2 останніх строчок коду в оверайді іквелс? Типу якщо ім'я не нал то ім'я не дорівнює самому собі, а якщо ім'я налл то воно не нал? Шо за херня , з хешкодом все ясно
if(если результат любого метода вернет true) то выполнится код после, а после прописано return false то есть, если внутри if мы по equals получили true, то возвращать false будет не правильно, поэтому приводим true к false таким образом (!true = false) сам долго голову бил...
Коротко, лаконично, по делу!!! Спасибо тебе добрый человек
Спасибо за поддержку!
@@arhitutorials подскажите пожалуйста , как IDEA автоматически переопределяет методы как у Вас.
У меня при переопределении выходит все по стандарту.
@Override
public String toString() {
return super.toString()}
@Override
public int hashCode() {
return super.hashCode() }
Понимаю может вопрос тупой , поэтому заранее извиняюсь...
А так в целом все последовательно и понятно , спасибо.
@@tweak7708 если я не ошибаюсь, вариант в видео был сделан ручную
@@tweak7708 если ты работаешь в Intellij IDEA то нажми Alt + Insert и выбери соответствующий пункт
Мужик, просто громадное спасибо, который раз меня уже выручаешь!!!
Спасибо за Ваши старания, один из ЛУЧШИХ каналов про программирование для новичков)
Благодарю за грамотную подачу материала, пояснение ньюансов и доступность исходников☺ ☺ ☺ Очень помагает наличие теоретической составляющей, а не просто кода!
Спасибо! Всегда с большим удовольствием смотрю ваши видео!
Тот случай, когда видео нужно СМОТРЕТЬ ДО КОНЦА! Самое вкусное (и полезное) в концовке!
Просто Гуру! Спокойный, наглядный и понятный стиль изложения материала. Нечасто такое можно встретить
Не жалко потратить время и настрочить комментарий)
Спасибо, очень полезное и приятное видео.
Видео, которое закрывает все пробелы в этой области. С удовольствием посмотрел.
Молодца!
Огонь! Отличные примеры, лучшее что я нашел на просторах ютуба! Спасибо молодой человек! От меня лойс и подписка!
15 минут и все понятно. Спасибо за труд!
Всем доброго дня! Обращаюсь к автору:
я пересмотрел множество различных видео уроков, Ваши как минимум одни из лучших!!!
Если у Вас будет время и желание, сделайте уроки по Java для начинающих. Уверен, что многие оценят!!!
Спасибо за видео. Очень доходчиво объясняется принципы работы этих методов, всё понятно 👍
Очень хорошая подача материала. Огромное спасибо. Всех баг автору.
Сергей, ты большой молодец! Спасибо!
Красавчик! Коротко и ясно, как и надо.
Спасибо за твои видео, все понятно без лишней воды
Счастья, здоровья, жену послушную
дай бог тебе здоровья, спасибо за такое отличное объяснение
Спасибо, очень помог. Лайк, подписка.
Восхитительное объяснение!
Отличные уроки. Спасибо
благодарю, очень доходчиво объяснил
Благодарю за ваши труды
Спасибо за видео. Очень понятно рассказали.
Хорошее объяснение! Спасибо!
Классное видео. Очень понятно и интересно. Спасибо большое !
Спасибо за видео!
спасибо сергей!
Сергей, добавь возможность донатить ) Очень ценные видео, спасибо большое!
Открыл глаза,спасибо
Супер! Спасибо!
как вы так хитро выделили все нужные для изменения поля result и поменяли их на hash? какие клавиши зажимать?)
Хорошее объяснение, спасибо
Спасибо! Толково.
Спасибо❤
Только начал учить Java и сразу влюбился в этот язык за его строгость и предсказумость, а тут это!!)))) НУ ЗАЧЕМ?))
Есть все таки что-то от сатаны в этих языках с приставкой Java ))
А по моему, все логично)
Это вы еще видео про ковариантность/контравариантность не смотрели 😅
А какие пункты Вы выбирали при автогенерации? или вы руками добавили 31?
У меня IDEA совсем в другом виде переопределила equals и hashCode. В методе hashCode вообще нет реализации, как на этом видео, только 'return Objects.hash(a, b)'.
А про instanceof было уже где то?
Почему this без точки и переменной?
Только так можно достичь Дзена )))
Интересный канал. Подписался. Хотел бы узнать, что необходимо знать, чтобы найти работу на вакансию java junior'a.
Очень доступно объясняешь. Спасибо! Продолжай в том же духе))) возможно лично или в соц сетях задавать вопросы о непонятных вещах в Java?
Спасибо! Стараюсь)
Конечно возможно. Только отвечаю иногда долго, потому что работа.
Так же, если будет интересен Android, могу помочь с обучением: ответы на вопросы, задачи, code review, и все в таком духе.
Sergey Arkhipov Спасибо большое! Android планирую немного попозже. Сейчас конкретно практикую Java Core. Так как цель устроиться на Junior. Возможно по Java делать code review?)
@@johannesbrown8853 упаковывай проект в zip и присылай на почту arhiser@gmail.com. Посмотрю и напишу отзыв.
Sergey Arkhipov спасибо!
спасибо)
Здравствуйте, спасибо за контент, все доступно объясняете! Только у меня вопрос обязательно ли что б equals и hashcode использовали одинаковые поля? т.е. можно ли высчитывать хэшкод по одному полю а сравнивать в equals по трем полям?
Все можно, только надо отдавать себе отчет, зачем это делать. А то так можно дойти до ситуации, когда объекты, равные по equals, будут иметь разный хеш-код. Тогда уже нельзя будет рассчитывать на то, что если хэш-код объектов разный то и объекты тоже разные. А значит equals() и hashcode() больше не согласованы и совместно не работают.
@@arhitutorials Спасибо! Теперь точно понял)
а почему в реализации equals для иммутабельного объекта достаточно сравнения по хэшу? хэш же может совпадать у разных объектов
Для equals недостаточно. В случае, если хэши двух объектов одинаковые, надо разбираться, что у них внутри.
слышала, что hashcode вычисляется лениво. поэтому перемещение объекта на другой адрес в памяти не меняет хэш
Вроде как да, один раз берется текущий адрес при первом запоосе, а потом все время выдаётся, даже если объект уехал в другое место.
Здравствуйте. получается что hashCode and equals вы переопределили сразу в видео на 4:13 минуте? и как на 11:05 вы выделили все слова и заменили их все одновременно?
Сделайте, пожалуйста, плейлисты
Ок, сделаю в ближайшее время
@@arhitutorials спасибо))
Приветствую! Сергей, если будет возможность показать перевод из двоичной системы в шестнадцатеричную минуя заход в десятичную.
Привет. Есть идея сделать разбор алгоритма, который переводит числа из любой системы в любую. Как-нибудь сделаю.
@@arhitutorials О-О-о, интересно бы было. Я с JavRush иду по курсу, сюда пришел когда искал поиск второго минимального элемента в массиве. Сделал задачу перевода из двоичного в шестнадцатеричного через десятичное, вывод результата как надо, но некоторые пункты не проходили. Подписан, так что увижу если что.
как он сделал с 11:06 чтоб выделить и стереть сразу несколько частей и на место их добавит новый текст?
неделя прошла, пока тишина((
вероятно alt +j для выбора alt +shift+j для отмены
@@Dmitri915 ctrl +ctrl +up or down и каретка клонируется
Сергей, у меня такой вопрос, а почему в качестве кода hashCode не использовать например UUID? разве это не поможет избежать коллизий? или тут вопрос скорее в том на основе чего генерируется хэш?
Два объекта с одинаковыми данными должны иметь одинаковые хэши. Это одно из свойств хэш функции. По этому просто так раздать всем UUID нельзя, надо генерировать на основе данных объекта.
@@arhitutorialsда, я понял. хеш генерится на основе данных. но тогда логичным думаю было бы использование md5, sha255 or crc32. или это просто долго?
Здравствуйте. Можете поподробнее объяснить на 4:27 " Contact contact = (Contact ) o " ! Вы об этом ничего не сказали. Так как от этой строки (которую я недопонял) идёт дальше построение кода на сравнение итд
В сигнатуре метода equals параметр имеет тип Object, что даёт возможность сравнивать на equals объекты разных типов. В подавляющем большинстве случаев это не нужно, по этому в методе сразу проверяется, что аргумент имеет тот же тип. Если да, то аргумент приводится к соответствующему типу, contact = (Contact) o;
И дальше уже идёт логика сравнения полей объектов.
@@arhitutorials спасибо
♥👍📹
Кажется начинает проясняться. Что еще важно знать на собеседовании?
Привет землякам))Можно ли позадавать иногда вопросы по джаве и по андроиду в личку ?)
Привет, можно. На главной странице есть ссылка на фейсбук, можно туда писать. Я вообще думаю, не создать ли нам сообщество или канал в телеграмме, чтоб было удобнее обсуждать вопросы, делиться новостями и т.д. Как вам идея?)
@@arhitutorials идея хорошая)думаю телеграмм канал было бы неплохо , ну и дискорд тоже можно)
@@arhitutorials вы уже создали телеграмм канал или дискорд ?можно ссылку пожалуйста)
@@Duskmage1991 Создал группу в Telegram:
t.me/ArhiTutorials
Добавил ссылку в шапку канала. Теперь будет у нас место для неформального общения, вопросов, взаимопомощи, новостей и прочего. Буду продвигать группу по мере возможности.
Чому ти оголошував клас Contact статичним? в чому різниця з НЕ статичним класом?
Вложенные класс
Спасибо, Серега. Слава Украине!
объясните строчку Contact contact = (Contact) o;
Это приведение типа переменной o к типу Contact.
Функция equals имеет следующую сигнатуру:
public boolean equals(Object o);
- то есть, может принимать в качестве параметра объект любого типа. По этому внутри нужна проверка и приведение:
if (!(o instanceof Contact)) return false;
Contact contact = (Contact) o;
А дальше, если нам передали объект типа Contact, тогда уже проверяем отдельные поля.
Спасибо. Позволю себе небольшой совет для шлифовки - можно чуть улучшить читабельность если поменять имена. Например вместо:
*contacts.contains(contact2)*
сделать:
*phones.contains(Ivan)*
Так точно не лучше
@@priest774 точно лучше, потому что имена переменных и методов не похожи друг на друга как братья близнецы
@@Das.Kleine.Krokodil это да, только читабельность кода и читабельность текста это не одно и то же. Ваш пример это каша. Сущность contact содержит набор данных: имя, телефон, адрес и т.д. соответственно contacts это коллекция сущностей contact, поэтому contacts.contains(contact) читается понятно и логично. А phones.contacts(Ivan) читается как телефоны содержат Ивана, какая связь вообще непонятно
Я вот только одного понять не могу, какого хрена в Set нет метода get()?!?! Ну положил я в Set данные, и что мне дальше с ним делать? Любоваться? Как вообще можно было так ступить и не дать возможности забирать элементы из коллекции.
А нововведенный Record? Молодцы, сделали Immuteble класс, но кто вас просил закрывать его от рефлексии? Что мешало добавить final и только тогда делать Record immuteble? А вот без неё - это простой POJO класс. И вместо повсеместного использования - их удел DTO, а народ продолжает использовать Lombok. А как бы шикарно record`ы смотрелись бы... да везде.
Просирать полимеры это прям талант.
11:08 можно shortcut
Alt + Shift + клик на нужное место в коде. Делал отдельное видео по этой фиче:
ruclips.net/video/9g6SP0JDzU4/видео.html
Да черт с иквелсом, ты лучше скажи как ты сразу несколько строк отформатировал)))
что за корзины?
Это речь про устройство хэш-таблицы. В ней элементы раскладываются по нескольким контейнерам в зависимости от значение хэш-кода.
пи*дец,вообще ничего не понял,откуда что берется(
я один абсолютно не розумію логіки 2 останніх строчок коду в оверайді іквелс? Типу якщо ім'я не нал то ім'я не дорівнює самому собі, а якщо ім'я налл то воно не нал? Шо за херня , з хешкодом все ясно
if(если результат любого метода вернет true) то выполнится код после, а после прописано return false
то есть, если внутри if мы по equals получили true, то возвращать false будет не правильно, поэтому приводим true к false таким образом (!true = false)
сам долго голову бил...
"Икьюалс" 🤦♀️🤦♀️
А Вы бы как сказали? Икуалс, иквалс?))
@@arhitutorials транскрипция ['iːkwəlz], то есть да, "иквалз" норм было бы
Отличное объяснение! Спасибо