Тестовое собеседование Java разработчика #23 - Аскар Сариев

Подготовка к собеседованию на Java Developer

Транскрипция видео:

  • Итак всем привет У нас сегодня в гостях Аскар Оскар пару слов о себе кто откуда Какие цели перед собой ставишь Привет привет Ну во-первых хотел бы начать с того что поблагодарить тебе за этот контент и за возможность поучаствовать в этом контенте он очень полезен для начинающих разработчиков потому что таковым Я являюсь начинающий разработчик с Java я познакомился в июне 2020 года уже более двух с половиной лет Мы с ней дружим стараемся каждый день общаться Сам я из города Саратова техническое образование

    00:00:00 - 00:01:28

  • наша Дружбы крепнет и как мне кажется Сейчас узаконить отношения то есть получить первую работу вот насколько уровень знаний сейчас имеется Хорошо хорошо давай тогда начнем с простого то есть один из стандартных вопросов от которого будем дальше двигаться как мы Передаем переменные в методы по значению или по ссылке и что такое как это понимаешь примитивные мы Передаем по значению то есть мы копируем значение Передаем по ссылке мы копируем ссылку и Передаем метод то есть в методе Мы также Обращаемся к этому объекту

    00:00:46 - 00:02:34

  • то есть мы произведем манипуляции по этой ссылке с объектом вовне этого метода эти изменения Также будут видны хорошо получается мы разделяем переменную на две группы да то есть примитивы и ссылочки по данных правильно можно подробнее про отличия между этими двумя группами примитивные хранятся стыки ссылочные хранятся значит примитивы хранят в себе непосредственно сами значения ссылочные то есть ссылка хранит в себе ссылку она хранится также в стеке само значение сам объектом хранится в хиппи Хорошо

    00:01:46 - 00:03:23

  • тогда вопросе как раз уже мы затронем немного память Расскажи пожалуйста как ты понимаешь представление о памяти в jvm Что у нас там в целом есть кто где что хранит как они между друг другом связаны на три памяти это стек хип и Мета спейс стеки как я говорил у нас хранятся примитивы там же хранятся у нас методы запускается методы То есть когда какой-то метод допускается создается фрейм они работают по принципу [музыка] последний зашел первый вышел Когда у нас метод отрабатывает на это место помещается

    00:02:38 - 00:04:10

  • размер области 1 мегабайт это по умолчанию размер имеет 256 мегабайт там объект уничтожается в автоматические кирпич коллектором а стек насыщается автоматически как только у нас отрабатывает метод значит метаспейс там хранятся у нас классы размер по умолчанию 82 мегабайта то есть метастой говоришь там хранятся классы можешь пожалуйста немного Уточнить что ты понимаешь у каждого класса есть объект типа Класс вот эти объекты типа класса хранятся там и хранят в себе метода данные этих классов там хранятся тактические

    00:03:31 - 00:05:02

  • перемены отлично принято Хорошо смотри вот ты еще говорил про стеки да то есть и так далее может быть детально рассказать что такое И сколько у нас этих стеков как они работают Ну стэк это быстрая область памяти на каждый поток выделяется свой стек Вот то есть у нас когда приложение спускается у нас запускается поток Main для него создается стек и потом уже если об этом потоке мы создаются новый потек потоки то для каждого потока выделяется свой стек хорошо Как связаны стек и хит между собой в стеке у нас как и говорил хранятся

    00:04:29 - 00:06:13

  • ссылочный переменные они ссылаются на объект который хранится в хиппи А если не ссылается что это означает это значит если объект создан и Это ссылка обновляется то объект становится мусором хорошо А смотри я к тому что если когда объект равен вот я пишу допустим Strings 1 чтобы не запуталась у него есть экземпляр п1 я пишут 1.5 куда мы сейчас ссылаемся то есть куда будет указывать эта ссылка Персен P1 и просто объявляем без точка с запятой да то есть вот написали и закончил Она никуда не ссылается на

    00:05:27 - 00:07:13

  • ссылается на канал да то есть получается Ну не ссылается на наладить если перемены никуда не ссылается это является как бы нам хорошо принято ты еще немного затронул сборку мусора сам ответе можешь пожалуйста питание рассказать что это за процесс такой Зачем он нужен и если ты знаешь какие у нас есть опции сборки мусора Да значит сборка мусора у нас для вас осуществляется автоматически сборщик мусора коллектор он работает следующим образом Значит эта область Hip Она нас делится на области еще s0 S1 Иден

    00:06:23 - 00:07:58

  • Иден у нас помещается все объекты которые вновь созданные значит как только нас достигается определенный предел это область значит помечается коллектором отличает объекты те которые на которые ссылаются ссылки то есть они живые они перемещаются в s0 затем очищает новыми объектами он также помечает и вместе с теми которые выжили из области перемещает С1 и также очищает уже и с0 и так продолжается до тех пор пока у нас остаются в конечном итоге те объекты которые уже прошли несколько этапов они перемещаются

    00:07:12 - 00:08:50

  • так из нас Существует несколько разновидностей гербич коллекторов это последовательный он называется он стерел гребешколектор который работает последовательно То есть когда у нас запускается Когда у нас он запускается то останавливается приложение он очищает память и приложение продолжает свою работу есть параллельный герметик коллектор который в основном работает правильном потоке но все равно он приостанавливается приложение нас приостанавливается на момент когда у нас очистка происходит мусором

    00:08:05 - 00:09:31

  • вот касательно опции что-то Я не понял Ну вот допустим ты вот как раз говоришь что есть последовательный Параллельная сборка мусора и так далее То есть вот я разработчик да то есть допустим мне не интересно это я пишу код хочу чтобы он работал в каких случаях волновать механизм сборки мусора Какие у меня есть опции И как я могу допустим Включить выключить там настроить чтобы сборщик мусора был вот такой например Честно говоря я не погружался в эту тему я могу сказать как это все сделать Я только настраивал размер типа

    00:08:49 - 00:10:16

  • командную строку но вот именно опционально Как изменять работу гербич коллектора Я не знаю нельзя менять Нет тип то есть Никак он будет работать мы не можем это повлиять А вот выбрать какой он использовать мы можем это деталь Это вопрос звездочку не такой часто и в реальной жизни не так много разработчиков сталкиваются с необходимостью как-то погружаться более глубоко Хорошо давай еще вот к чему Вернемся вот ты как раз затронул параллельное сборка мусора последовательная поточная понимает Давай погрузимся немного в раздел по

    00:09:34 - 00:10:55

  • точности и для начала Расскажи пожалуйста как ты понимаешь что такое Чем отличается термины как многопоточность параллелизм и точность просто такой подход программировании Когда у нас какой-то кусок кода выполняется асинхронность это когда мы в основном потоки можем создать какой-то дополнительный поток дать ему задачу и при этом не дожидаться результата выполнения этого потока параллелизм это что-то похожее с многопоточностью это когда у нас несколько потоков одновременно выполняет какую-то задачу

    00:10:18 - 00:11:49

  • несколько потоков одновременно выполняет какую-то задачу В принципе понял Давай немного вот еще уточним В чем разница между именно многопоточностью с одной стороны и параллелизмом параллелизм это когда Я так понимаю что многопоточность это общий термин присущий к приложению параллелизм это когда один какой-то ресурс одним ресурсом могут работать Одновременно несколько потоков Хорошо если у меня это редкость но все-таки однопроцессорная Железяка они параллелизм возможен или нет на ядерным процессоре там механизм

    00:11:11 - 00:12:57

  • контекст Switch то есть псевдо параллелизм То есть как будто бы параллельно Но на самом деле все равно они выполняются последовательно хорошо но это многопоточность это ну вампоточности на самом деле мне кажется это программе могут работать несколько потоков Да много потоков я создал 1000 потоков но захотелось у меня многопоточное приложение Да отлично хорошо одновременно вот если брать в этот момент в этом мгновение два потока могут работать вот когда мы говорим про потоки это что-то реальное или абстракция поток

    00:12:11 - 00:13:41

  • то есть связан ли поток в приложении Java с нативным потоком от на операционки Да это реально это созданный объект такой же как и поток Main Нет немного про другого говорит смотри то есть вот есть Прямо железо Да вот если система которая работает с потоками есть Java приложение которым тоже есть потоки вот эти потоки в операционке потоки в Java это одно и то же это разные вещи Я думаю что это одно и то же Одно и тоже хорошо получается Если это одно и то же то я могу из приложения на это влиять правильно

    00:13:24 - 00:15:00

  • работаете потоков которые нативные которые мы сами создали это которую операционка то есть мы создаем не можем хорошо хорошо с этим разобрались Давай тогда еще поговорим Вот про что мы затронули и например ассасинхрона сейчас связаны такие интерфейсы как Future Ну и класс Future да для чего они нужны и какие между ними Есть отличия Future это объект который помогает нам получить результат которого можем получить в будущем конфликты был Future он расширяет фьюче фьюче есть недостатки такие что у него есть метод который

    00:14:18 - 00:16:06

  • позволяет получить в будущем результат но если ресурс этот занят или завис то основной поток в котором он также зависит он расширяет его функционал Он позволяет не дожидаясь того поток в котором мы хотим получить результат позволяет основному потоку продолжить свою работу и повесить там дополнительные какие-то функции колл-бы То есть когда уже результат придет он может результатом что-то сделать также есть там методы там плит у комплита был фьючер который позволяет получить какой-то [музыка] дефолтный результат Если вдруг тот

    00:15:29 - 00:17:05

  • результат не пришел или же у нас не удовлетворяет также там можно последовательно вызвать несколько фичу можно сгруппировать что лишен это расширение Хорошо смотри такая ситуация То есть например у меня есть какое-то асинхронный вызов куда-то там который возвращает мне e-mail и я хочу на вот этот полученный мною отправить письмо как это сделать в компьютер представим что есть какой-то объект cp1 в котором строка есть метод Send email который ожидает внутри себя строку Как мне передать вот этот метод

    00:16:19 - 00:17:46

  • вот эту строку которая сейчас хранится конфликт под Future У тебя есть компьютер email в нашем случае есть метод Send email который ждет внутрь себя вот объект string email на который будет правильно какой-то стандартное письмо как мне вытащить из этого cp1 вот это значение и передать его в метод email Ну комплект можем на этом объекте вызвать метод и передать его в параметры Ну хорошо допустим он там есть но смотри метод блокирующий или нет Да он тоже блокирующий мы можем вызвать а там есть метод seply assing который

    00:17:03 - 00:18:49

  • нам позволяет получить объект типа соплайр и передать его в сент параметры То есть получается будет cp1 точка сопла Синг да потом лямка и в центр mail ударил это значение супер отлично хорошо с этим разобрались Давай тогда еще поговорим немного про коллекции Смотри вот если например коллекция хэшмэп как ты понимаешь как она устроена какие у нас сложности базовых операций в ней и является ли она потока безопасности Так мы пол у нас интерфейс который особняком стоит Объект который хранит себе ключ значение

    00:18:14 - 00:19:55

  • основная реализация это хэшмапы значит как она устроена внутри Она состоит из массива по умолчанию у нас 16 ячеек массива Каждый каждый человек у нас называется бакетом Бакет каждый человек у нас ссылается одна связанная список в которых непосредственно хранятся у нас значение ноты объекты not это у нас получается внутренний класс кошмапы он себе хранит значит хеш-код значение ссылку на следующий элемент [музыка] сложности если у нас правильно реализованный метод сложность я понимаю ты говоришь правильно

    00:19:12 - 00:20:57

  • реализован допустим не реализован супер мега правильно некуда а что это значит что мы хотим избежать делая в кавычках правильный метод мы стараемся Мы хотим избежать коллизии так называемых Когда у нас двух объектов в двух объектов одинаковых хэш-код отлично точнее у разных объектов хорошо Да я понял супер Смотри такой вопрос а можно ли мы гарантировать например у меня есть какой-то допустим старинга у меня ключом является string Могу ли я гарантировать что у меня все Шкоды будут уникальные нет такой гарантии нет поскольку размер

    00:20:22 - 00:22:03

  • коды ограничен размером винта он тоже имеет свои пределы и Если даже у нас идеально определены эти методы то все равно чисто теоретически возможно что будет коллеги У нас очень хорошо допустим у нас есть коллизии какая сложность поиск по ключу будет в этом случае Тогда от единицы поскольку у нас объекты будут попадать в одну ячейку хорошо Есть ли какие-то оптимизации вот непосредственно JAVA да у нас восьмой Java предусмотрено автоматическая оптимизация если у нас размер ячеек превышает 64 элементы И

    00:21:13 - 00:22:49

  • когда у нас длина списка превысит 8 элементов то у нас получается список преобразуется в три в три неистрельная красная черная сбалансированное дерево Ну хорошо этот если взять А что мы хранили листе мы храним объекты сами найду то есть ноды Ну получается ли я к тому что говорю к чему я это все То есть ты говоришь что у меня по дефолту вот Бакет это линькат лист правильно да отличника то есть и там хранится какое-то значение Да код значения ссылка на следующий элемент то есть какой-то объект да то есть Пока я

    00:22:02 - 00:23:37

  • без ключа спокойно обхожусь Мне хватает значения чисто Теперь мы например преобразовали условно наш linked листа в какой-то сет Да мы говорим сейчас 3 мэп да получается это значит ключ и значение то есть до этого мне хватало только значения А тут мне Понадобился ключ значение звучит это логично какой тип объекта мы храним мапе вот эти баке как он называется внутренний класс Map entry называется да то есть вот map.n3 вот они как бы вводное значение при супер хорошо и давай вот этом был финальный вопросик из

    00:22:53 - 00:24:23

  • хэшмэп является ли хешмы потока безопасной коллекции Нет кошмак Нас не потока безопасная у нас хардж маппе предшествовали предшествовала коллекция хэштейбл которая была безопасной которая сейчас не рекомендованных использованию потом у нас есть еще синхрона тоже потока безопасная но такая же медленная как и что у нас уже появился современные мамы Хорошо если А вот еще который является безопасным В чем фундаментальное отличие между вот этим хэштей был не хотим использовать в хэштей был у нас получается методы

    00:23:44 - 00:25:18

  • полностью получается весь метод синхронизированный и только один поток может работать с хэштейбл в конкар у нас сколько ячеек массива столько у нас и потоков одновременно могут работать с этим конкаен хешмоб вот с этим можно поспорить что сколько ячеек столько потоков могут работать потом что мы блокируем не полностью всю мы да а блокируем то есть сегмент сегмент Хорошо согласен Давай наверное из коры еще такого просек финальный будет А вот есть у меня такая аббревиатура как солит там у меня есть буква

    00:24:49 - 00:26:25

  • л как она расшифровывается И как мы понимаем вот этот принцип это принцип постановки Барбары рисков которые гласит что дочерние классы должны быть как бы сказать заменителем родительских классов в приложении То есть если мы подставим вместо родительского класса место родительского объекта дочерний то приложение должно также работать корректно хорошо привели пожалуйста пример нарушения принципы барбаристов принцип принципа барбарисска этого принципа верно принципа но я читал что если мы явно пишем что

    00:25:36 - 00:27:16

  • вызываем оператора если пишем instance of то явно ручные принципы не совсем понял У меня есть интерфейс А у него есть допустим у метода А есть метод тест один который я имплементирую как мне сделать так чтобы Сейчас вроде пока соблюдается принцип рисков Как мне его поломать Что надо сделать так чтобы вот все я постарался и принципа Нет он не соблюдается точнее нет если мы получается создадим объект не не интерфейс не типа интерфейс создадим объект непосредственно импул То есть я напишу А им Паладин там А им

    00:26:30 - 00:28:04

  • паладинью хорошо допустим А такой вопросик Могу ли я иметь какие-то методы которые публичные которые находятся именно в Паладин который отличается от aimple2 Может ли имплементации один иметь какие-то другие публичные методы до которых которых нет в интерфейсе А и которых нет в имплементации в нем есть метод 1 Я создаю класс А им Паладин который интерфейс А И добавляю в нем какой-то метод Public воет супер один метод которого нет да хорошо поможет мне это в соблюдении интерфейса рисков или это потенциально

    00:27:36 - 00:29:21

  • нарушит его То есть это предпосылка к нарушению близко Ну он не нарушит потому что мы же если будем вызывать этот какой-то метод с помощью объекта который типа интерфейс мы не сможем обратиться к этому методу хорошо Хорошо давай так с другой стороны Например я пишу а Intel один а им Паладин равен ю а импуль 1 и используют только общие методы Если я сейчас захочу поменять его на aimple 2 примеру и пишу а им Паладин Ой Пробел не меняет даже название переменной остается А им Паладин равно А им я столкнулся каким-то проблемами

    00:28:33 - 00:30:18

  • Пока нет только общие у этих двух классов Пока нет нет хорошо допустим перед этим я в aimple 1 добавил куда-то свой кастомный метод которого нет ни в интерфейсе ни в другом презентации и использовал его где-то завязался на нем свои логике и теперь эти манипуляции произвел да то есть косвенно это предпосылка к нарушению принципа поэтому мы обычно стараемся чтобы в интерпретациях были только те публичные методы которые есть в общем интерфейсе да то есть не завязываясь на кастомные методы супер хорошо по Корее У

    00:29:31 - 00:30:48

  • меня пока Вопросов нет смотри я сейчас тебе скину ссылку на и попрошу тебя решить одну задачку ожидаем все супер смотри Нам предлагается решить задачу то есть нам на вход приходит массив целых чисел размера N и нам необходимо вернуть наиболее часто повторяемый элемент то есть наиболее часто повторяем элемент это тот который повторяется более чем N делить на 2 то есть рассмотрим примеры У тебя есть пример один когда на фотке приходят нам С3 23 ответ будет три потому что три повторяется два раза а

    00:30:10 - 00:31:43

  • элементов всего три Далее в примере 2 у тебя идет 221122 ответ будет два потому что двойка повторяется 4 раза а у тебя 7 элементов той массиве У нас есть constraint то есть N Это количество элементов в массиве N может быть в диапазоне от одного до 54 и значение которое воспринимать каждый из переменных находится в диапазоне от -109 до плюс до 9 то есть нам предлагается решить проблему в линейное время и со сложностью по памяти о1 вопросы Я так так мне просто пока смотрю на constrains для оптимизации то есть потом когда мы

    00:30:59 - 00:32:37

  • решили можно немного оптимизировать и так далее так ну в лоб сразу приходит в голову это брать по очереди Каждый элемент сравнивать значениями остальных элементов поставить счетчик Да если если следующий элемент превысит эти повторения то значит это значение вернем Хорошо хорошо Как ты предлагаешь считать эти элементы то есть берем первый элемент тройку сравнивать так получается что надо хорошо Какая скорость будет этого решения Как ты думаешь плохая n квадрат откуда берется квадрат получается каждый раз будем проходить

    00:31:51 - 00:33:32

  • поэтому посеву Ну правда не от начала Но тем не менее хорошо Хорошо давай еще подумаем Как можно подойти к решению данной задачи честно Давай так какая у тебя проблема возникает сейчас какая проблема то что это долго будет Наверняка есть Я пока не знаю какое-то решение Хорошо будет счетчик мы возвращаем возвращаем количество они мы само значение так Наверное мы создадим Я просто сейчас сразу что мне приходит в голову слух Говорю Наверное мы создадим мапу где у нас будет каждый раз помещаться это это этот

    00:33:04 - 00:34:55

  • элемент и счетчик который нам посчитал сколько раз он повторяет вот так счетчик который посчитает сколько раз повторяется ты сейчас предлагаешь через мапу да то есть это дачу хорошо то есть как я понимаю у тебя будет мапов который ключом будет что элемент который мы сейчас в той трассе хорошо значение будет счетчик отлично хорошо то есть потенциально это рабочее решение Давай еще раз какая у нас ожидается временная сложность этого решения но больше чем почему придется пройтись по входному в этом

    00:34:35 - 00:36:13

  • случае Ну больше больше чем много нас почему почему так думаешь Давай подумаю То есть ты говоришь что у тебя есть мапа в которую нужно накинуть элементы Да и почитайте их повторение вот смотри я беру допустим первый элемент видно же да да вижу беру двойку Я прохожу до конца раз первой операции Потом беру следующий двойку опять прохожу потом единицу прохожу и так далее Почему ты хочешь да Так для чего тебе несколько раз проходиться если ты вот сейчас можешь ты хочешь пройтись по массиву тебе нужно посчитать вот все уникальные

    00:35:25 - 00:36:57

  • элементы будут ключами Да их количество будет значение то есть вопрос Зачем тебе несколько раз проходиться поэтому а слушай да я же могу Просто каждый раз перемещаться в массивы и каждый раз его сравнивать со всеми значениями значениями тебе нужно сейчас просто посчитать количество повторений данного числа правильно Да Смотри Представь что сейчас например ты находишься На первой двойке тебя есть пустая мапа ты Закидываешь сюда элемент двойку счетчик будет равен чему на начальном этапе Ты переключаешься следующий элемент

    00:36:20 - 00:38:05

  • двойка хочешь его закинуть в мапу сейчас подумал как это сделать увеличиваешь каунтер еще на один потом на единицу и так далее вопрос Зачем тебе несколько раз где-то перекручивать переходить По этому массиву если в лоб идешь и добавляешь элементы поочередно Так у нас ключей же не может быть одинаковых Ну а если ключ повторяется Это что значит для нас ключ повторяется он просто затирается но зачем затирать Нам его мама же не может ходить дубликаты давая другом поговорим То есть если у тебя уже есть двойка А ты считаешь количество

    00:37:21 - 00:38:50

  • повторений а если быть не двойка тройка Ну хорошо тройка отлично допустим двойка попала что-то должен сделать со счетчиком отлично хорошо мы по время что-то теряем от этого нет нам все равно это все равно будет какая сложность будет доступа к элементу по ключу в мапе если это int У нас коллизии возможно Но в данном случае да потому что один хорошо то есть еще раз при таком подходе какая будет временная сложность нашего решения если мы только один элемент сравним со всеми то будет у от единицы а почему ты говоришь что один элемент

    00:38:14 - 00:39:45

  • сравним со всеми Если ты сейчас выполняешь какую значит ты идешь по мате и просто Закидываешь поочередно все элементы в эту мапу если я все равно пройду по массива от начала до конца то от n от N до То есть ты будешь бежать по массиву один раз правильно понимаю Отлично вот то есть это вписывается в первую часть нашего условия что мы хотим за решить за линейное время да то есть то что мы хорошо сложность по памяти какая будет здесь сложно сказать Ну смотри То есть ты создаешь новую структуру данных которая

    00:39:13 - 00:40:32

  • будет храниться все элементы которые есть в массиве правильно То есть у тебя какая будет сложность по память в этом случае столько сколько элементов только Да это как называется сложность Когда столько сколько элементов массиве не знаю Линейная Линейная сложность времена линии А по памяти какая будет сложность по памяти не знаю такого понятия тоже тоже линейный То есть ты создаешь памяти столько же места сколько есть в начальной структуре данных Да отлично супер Давай попробуем реализовать это решение которое ты сейчас озвучил

    00:40:03 - 00:41:15

  • так вот создаем мапу где у нас будет элемент и количество повторений тоже счетчик не знаю for Так мы сравниваем получается его со всеми или мы получается сразу закидываем элементы в мапу также условия отлично какое будет условия если тогда здесь цикл другой будет наверное Зачем цикл пока цикл вот цикл Можно не трогать вроде бы бежим слева направо все красиво не вижу Пока причины менять сам цикл Какое условие то что ты сейчас хочешь выяснить Ну что этот элемент Мы сейчас в этом цикле получается просто

    00:40:48 - 00:42:28

  • добавляем правильно зачем то есть мы можем один раз пройтись То есть можно принципе 20 пройтись но ты сейчас хочешь наполнить ты сейчас Если я правильно понимаю столкнулся со сложностью который заключается в следующем ты не знаешь Чему равен или не один хорошо то есть в каком случае ты запишешь сюда один получается в самом начале он сразу будет Один потому что мы стоим на том элементе Ну хорошо перейдешь на двойку как ты поймешь стоишь а мы должны условия задать если мы если мапа уже содержит прилично тогда если содержит то мы что

    00:43:21 - 00:44:54

  • делаем то мы увеличиваем каунт отлично хорошо А если не содержит если если не содержит если ты первый раз добавляешь элемент Если вы еще в мапе Нет один будет один супер Давай напишем так если так я не помню и так Правильно же да равно и подожди Почему равно и как мне Ты же получишь значение счетчика вот но ты говоришь что если мап ГЭТ и равен самому и А как то есть мы с тобой решили что если у тебя элемента нет то мы записываем по дефолту 1 Давай это напишем теперь это условие так если я напишу выражение мапги и я

    00:44:14 - 00:45:55

  • получил значение же получается Ну конечно да то есть я получу Да Чему равен если ты в первый раз зашел если вчера зашел будет смотри у тебя пустая мапа пустая ничего нет ты говоришь пустая мапа которой ничего нет Дай мне значение по ключу 2 тот и получил ответ от мапы один Давай еще раз смотреться У тебя есть пустая мать ничего отлично хорошо и если у тебя нал ничего нет что ты запишешь мапу каунт я запишу Map точка и так я смотри Давай еще раз мы с тобой отлично супер Да теперь на строку 27 посмотрим ничего

    00:46:06 - 00:47:58

  • не равно получается Ну равно чему мы с тобой только что решили Давай еще раз условия если ничего нет я получу нал правильно и в этом случае аккаунт еще раз принимать на строку 27 что в условиях поправить наоборот если равно отлично давай это напишем супер с этим решили давай теперь А если не равно на что мы делаем то есть ЛС например в данной реализации пока я вижу что через аккаунт тебя сейчас чему аккаунт у тебя сейчас чему то есть и каждый раз ты будешь считать общий каунтер для всех своих элементов

    00:47:43 - 00:49:06

  • нет значит То есть ты хочешь то есть Давай еще раз проговорим То есть если там не было ничего мы это решили но допустим у тебя там есть число 8 ты хочешь Что сделать с восьмеркой в этом случае как сейчас я проговорю значит Давай Стоим мы на двойки мы смотрим попадаем сюда проверяем если идем на следующий двойку проверяем а получается Мы ушли второй раз заходим двойка нет двойку что присваиваем аккаунт у нас увеличится на единицу То есть тебе нужно увеличить текущее значение этой переменной на 1 Как это

    00:49:00 - 00:50:47

  • отлично как это сделать Кант плюс дальше переходим на единицу смотри чему У тебя сейчас равен каунт вот на этой ноль здесь хорошо но ты попал сразу То есть ты хочешь сейчас записать 0 сюда вот из того что я вижу Почему я здесь же увеличил на единицу и сюда записал уже единицу хорошо один То есть ты хочешь записать один У тебя сейчас аккаунта равен То есть у тебя сейчас счетчик для числа 2 равен 1 ты его встретил и снова хочешь записать один я правильно понимаю Ну да получается так давай еще раз что ты хочешь увеличить

    00:50:21 - 00:51:52

  • Давай зайду туда тоже в этом сейчас будем жарить решил все рассказал уже все нормально Смотри вот сюда то есть например мы с тобой делаем я ввожу переменную равен и мы получили То есть я пишу если текущее число равно то я добавляю сюда то есть я говорю то в этом случае например каунтер плюс если это твои логики Да Counter плюс и записал его а если раввина Извини то я записываю один по дефолту один записали Супер Теперь если нет я говорю что Counter плюс записали аккаунт все и мы с тобой заполнили нашу мапу вроде бы все готово

    00:51:46 - 00:53:30

  • то есть вроде бы нормально то есть мы мапу здесь например заполнили дальше Мне необходимо когда это Map уже готова Мне нужно отсюда достать максимальное значение отлично то есть как максимальное значение [музыка] может по-другому сделать допустим Макс допустим будет Макс 0 то есть соответственно здесь пишем что если например это маг здесь вот здесь наверное меньше Карен каунтер вот так можно сделать и то в этом случае Макс каунтер равен Карен каунтер Да вроде бы все все корректно даже вот эту штучку можно

    00:52:50 - 00:54:42

  • принципе вынести вот сюда и вот тут чтобы не понимать на мы говорим что Макс каунтер равен 1 точка запятой и в педали мы вот сюда то есть соответственно у тебя maxcout 300 будет обновляться и тут мы сделаем Return maxcounter тут есть парочка ошибочек которые живут такие синтаксические Но это детали давай резюмируем что мы с тобой сделать идею самого начала ты дал корректную То есть ты выделил дополнительную структуру данных хэшмэп отлично потому что гарантирует не доступ к элементам за константное время Который ключ это будет

    00:54:11 - 00:55:23

  • самое число значение это будет количество повторений данного числа моей маме правильно То есть ты проходишь заполняешь эту мапу ты говоришь что если у меня такое число уже есть то я буду лечь отчёте если нет ставлю один по дефолту и потом просто буду увеличивать и в конце я увеличил Макс по дефолту он не равен допустим 0 потом мы его постоянно будем увеличивать после на выходе из каждого из массива да то есть maxcounter меньше чем то мы его будем увеличивать Извини да то есть maxcounter то равен допустим мне пока пока 0 то есть

    00:54:50 - 00:56:09

  • maxcounter меньше и тогда равен и присвоили и вернули сам результат потому что возвращаем мы не количество повторений именно [музыка] тому число которое повторяет чаще всего Ну там условия поправить если повторение больше этого ну точнее не самый больше половины все Ну сама концепция думаю ясна Хорошо все давай стопать экран искали пойдем то дальше с тобой по по вопросам теоретическим нашим это есть Давай тогда с тобой хорошо отлично по задаче ты все правильно сказал концепцию ты правильно сказал сложно корректно нужно было

    00:55:32 - 00:56:55

  • просто чуть по коду не сам большой опыт решения задач Да у тебя то есть ты не так много времени посвящаешь Дело в том что когда начинался путь Я там начинал там было достаточное количество таких задач но по прошествии уже год естественно этот налог подзабылся так так так так хорошо Давай пойдем по вопросам Давай поговорим про базы данных и поговорим про такие штуки как индексы что это такое как они работают что они нам дают так индекс и это Такая сущность которую мы вешаем на столбец который мы хотим

    00:56:27 - 00:57:59

  • часто использовать при поиске какого-то элемента очень часто если у нас база данных очень большая то это ускоряет работу нашей базы данных но есть ограничения если мы хотим мы будем часто пользоваться изменять этот столбец то мы только ухудшим ситуацию потому что индекс они нас тоже хранятся в базе данных и каждое изменение этого столбца приводит к изменению индексы Отлично Да хорошо принято смотри за счет чего то есть как они устроены почему они не дают прирост по перфомансу и насколько конкретно вот использование

    00:57:21 - 00:58:54

  • индекса повышает скорость получения если без индексов у нас получается скорость поиска от N Линейная если мы применим индекс то у нас будет скорость ООО от логарифма N потому что внутри индекса устроены как дерево обычное грубо говоря триммеда где ключ значение Где ключ это само значение колонки а значение Это адрес хорошо супер с этим разобрались есть такая штука второй вопрос Смотри вот Я создаю Воронки допустим есть таблица клиента есть таблица заказы у заказы из поля клиента и который является внешним

    00:58:08 - 00:59:42

  • ключом на таблицу клиенты какие варианты поведения У меня есть при удалении Например я уже заполнил таблицы У меня есть клиент сердечником 8 у него есть 50 заказов таблицы заказы я пытаюсь удалить клиента Какие опции опции В каком плане Ну вот я вот сейчас попытаюсь удалить этого клиента но удается если у нас сущность получается у нас отношения один ко многим если Мы удалим клиента а заказа ссылаются на одного клиента 3 то эти заказы удаляться хорошо то есть допустим А могу я запретить удалять если

    00:58:58 - 01:00:32

  • это заказы Ну да такое Можно два варианта либо удалить все вместе либо запретить А еще у нас ордеры получается остался если это поле у нас получается три варианта супер Давай поговорим про gbc есть у меня такая штука это такое и какие у меня есть опции конфигурации резольцет это у нас объект resol-цент вообще это интерфейс объект этого типа мы получаем после обращения в базу данных с помощью сущности statement то есть мы когда хотим достать эти данные они помещаются врезался ты потом циклом пробегаемся по этому резал сету и

    00:59:55 - 01:01:45

  • с этим их объекты Хорошо смотри вот этот же не просто дома есть очень грубо пристает она делает Могу ли я например если я поменял значение сразу записать базу данных или Если поменял объект то есть мы получили создали объект инициализировали ему значение поля сейчас допустим есть такое вопрос У него есть поле экспириенс это число то есть опыт сейчас три года хочу поставить четыре года Ну я так думаю что если мы транзакцию не закроем то можем наверное Да по дефолту так будет или как Нет да то есть там есть Ураза некоторые

    01:01:18 - 01:03:11

  • конфигурации да то есть там прола был апдейта был ну и так далее но предполагаю что можно будет сохранить да то есть такая возможность хорошо что такое хранимые процедуры в базе данных и как можем эти процедуры вызвать Ну я честно говоря не пользовался Я знаю что они есть это эта процедура который хранятся на стороне непосредственно самой базы данных которые выполняются на ее стороне которые написаны на специфическом языке мы их можем только вызывать Но Я никогда а хорошо Хорошо давай так какие ты

    01:02:24 - 01:04:01

  • видишь минусы в использовании процедур минусы они довольно таки не распространены они крайне специфических случаях используются Хотя имеется преимущество не Безусловно а вот почему я часто Не используют долбили бы все постоянно хранимые процедуры вся нагрузка идет на базу данных мне надо все на БДС и просто дергаю про цирке получая данные сразу наверх Мне кажется это перегружает базу данных если мы что-то будем менять на стороне клиента То есть это получается мы влезаем реализацию базы данных и что-то там

    01:03:24 - 01:04:55

  • делаем Что не является корректором например есть процедура BC и мне и она почитать какую-то процент чего-то тут Приходите говорит надо срочно менять логику формулу подсчета То есть тебе нужно будет ее поменять на стороне bd-шки ты полезешь базу данных и будешь там менять Да и трек этих изменений довольно таки не самое лучшее То есть если мы в коде поменяли мы там через get это все видим можно теста писать все хорошо все отличника А если мы меняем на базу данных то мы как бы теряем видимость поэтому просторы

    01:04:17 - 01:05:43

  • используется специфических случаях не так часто потому что видимость и контроль страны приложения Хорошо понял мы не можем проверить результат этой работы Да отлично хорошо есть такая штука есть есть Давай двигаться тогда Дальше смотри вот у меня есть hybernate есть такая штука что это такое зачем она нам нужна сущность которая нам позволяет создавать но она создается один раз при запуске habernation То есть когда мы хотим открыть сессию и произвести какие-то команды в базу данных Мы открываем сессию

    01:05:01 - 01:06:49

  • проводят транзакции закрываем сессию у нас получается жизненный цикл сессии в рамках одной транзакции А может ли мне быть три транзакции в рамках одной сессии может да то есть Пока мы не вызовем Get транзакшнт мы получаем транзакцию у сессии не ошибаюсь сессии а сессия позволяет создавать транзакции хорошо Хорошо Могу ли я через кибернет управлять уровнями изоляции транзакции транзакции Да потому что там транзакшен но нет транзакций не поддерживается транзакции есть committed Ну то есть позволяет допускает

    01:06:05 - 01:07:49

  • нас грязное чтение затем комбитед запрещает грязные но допускает повторное чтение У нас есть репетита говорит которые запрещает повторное допускает фантомное есть сериал который самый жесткий полностью все запрещает отлично принято Хорошо хорошо а как мы Допустим их указать То есть я хочу чтобы мы использовали например да Хорошо тогда Хорошо смотри давай такой финальный вопрос от которого можно немножко еще походим Ты работал допустим у нас будет приложение которое используют а наш внутренний мы сами проверяем и так

    01:07:12 - 01:09:00

  • далее вот смотри я отправляю на рестлпиай запрос логином из пароля допустим они корректны в ответ получаю валиный токен опиши мне пожалуйста путь этого запроса от отправки мною до получения больного токена Так у нас получается прежде чем запрос попадет в диспетчер сервета он проходит через целую серию фильтров есть один фильтр называется этот фильтр создает объект называется юзернейм passwordication туда он в этот токены есть два поля принцип и он туда эти значения он выдергивает получается запросы туда их

    01:08:16 - 01:10:07

  • инициализирует дальше наш летит менеджер выбирает Я хочу я делал один хочу получить То есть я думаю что он допустим у нас вот этот inpoint находится в айт-листе то есть пермит All API V1 aus Login У меня открытый с него обращаются все он его пропускает теперь вот мы прислали логин пароль хочу получить токен какой будет путь какой алгоритм действий то есть мы с базы данных получили логин и пароль я пока я послал запрос запрос Да через запрос и Я отдал корректные данные вот первый фильтр пропустил

    01:09:13 - 01:10:55

  • следующий шаг что мы делаем Ну мы дальше настраиваем мы настраиваем указываем там URL по которым мы разрешаем проходить уже настроили уже разрешили все прошли попали мы на inpoint логина то есть что мы дальше делаем мы вводим логин пароль дальше эти данные сверяются с теми данными которые у нас хранятся если они как как они теряются вот пришел тебе a b c email.com пароль 12345 он правильный допустим как я понимаю что он правильный То есть откуда я буду брать данные у нас сама система там сам Spring сравнивает

    01:10:16 - 01:11:56

  • сверяет данные те которые мы ввели формочки сверяет с этими данными эту процедуру по моему проводит аутентикейшен провайдер да то есть некие провайдер который юзернейм Паспорт бла-бла-бла да То есть вы Хорошо согласен сверили Молодец правильный пароль правильный email что дальше дальше зависимости от того как мы настроили мы можем указать там что дальше хуй странице мы переходим либо он либо мы сразу возвращаем если не настроили мы сразу возвращаемся на тот адрес куда мы вообще шли после формочки

    01:11:12 - 01:12:37

  • мы можем настроить настроить Куда мы пойдем после Удачного логина куда мы попадем после Удачного логина Я так понимаю что ты сейчас все-таки говоришь немного про приложение в котором мы попадаем а сейчас же мы с тобой говорим просто про возврат токена вопрос был следующий что дальше происходит Ну дальше запрос идет у нас контроллер уже прошел внутри диспетчер в среднем просто обрабатывает обычную проснулся то есть мы уже получили его через матчером сделать пермитол его пропустили диспетчер советую редиректору на

    01:11:55 - 01:13:25

  • корректный контроллер контроллер конкретную логику которая тоже описываешь да что мысль Вот мы вот в этой логике по поняли что имейл правильный пароль правильной комбинации именно пароль правильная что дальше не понимаю вопроса мы отдали логин и пароль в ответ хочу получить gvt Talking Мы дошли А ты не работаешь Всё я понял Я просто все теперь отлично хорошо Это не проблема допустим корректный логин пароль произошел Привет как мы понимаем что на Привет может прийти допустим там есть как мы узнаем что еще что допустим я

    01:13:03 - 01:14:40

  • залогинился закрыл браузер пошел попить молока через 5 минут вернулся открываю браузер у меня ну открыто Все я вижу там список нам пользователей транзакции я залогинен понимает что вот этот запрос он залогиниться вот я могу показать Этому пользователю сейчас его транзакции Ну на стороне серверы хранятся на сессии Хорошо последний последний посещений клиенты А как он понимает что вот это обращение на сервер вот этого клиента хорошо здесь хорошо с этим с этим есть супер и давай вопрос Что такое тестирование Зачем оно нам

    01:14:10 - 01:15:42

  • нужно Юнит тестирования это тестирование которое проводит разработчик оно проводится для того чтобы проверять корректность тех методов которые он написал То есть вставляем туда те значения которые нас приводит к корректному выполнению которые приводят к некорректно проверяем правильно ли мы написали метод и в случае если мы какую-то логику меняем мы можем автоматически нажать кнопочку и проверить у меня вопросов нет я просто хотел бы поблагодарить тебя Спасибо представлена возможность это тем более я нахожусь на этом пути на

    01:15:19 - 01:17:11

  • начальном сейчас я нахожусь в поиске работы это возможность мне проверить свой уровень знаний проверить не получить опыт прохождения собеседований вот хотите сказать спасибо пожелать тебе благополучия пожелать успехов тем кто сейчас учится удачи тем кто Находится в поиске сейчас очень высокие требования Еще раз спасибо Тебе да хорошо те тоже спасибо тогда на этом мы Прощаемся с вами

    01:16:27 - 01:17:46